The Singularity Image Format (SIF) is a container image format employed by the open-source Singularity container system. SysLabs/sif is the reference implementation of this format and has recently been found with a vulnerability (CVE-2022-39237) in versions prior to 2.8.1. This issue concerns the github.com/sylabs/sif/v2/pkg/integrity package, which does not verify that the hash algorithm(s) used are cryptographically secure when verifying digital signatures. To fix the issue, a patch has been implemented in version 2.8.1 and later of the module.

Exploit Details

SysLabs/sif's use of insecure hash algorithms while verifying digital signatures allows attackers to exploit the system by breaking the integrity of the container images. This, in turn, can lead to data corruption, unauthorized data access, and a potential compromise of the entire system.

Here's a code snippet highlighting the affected package

package integrity

import (
    "crypto"
   "errors"
    "github.com/sylabs/sif/v2/pkg/sif"
    "io"
)

func VerifyBundleSignature(sifFile *sif.File, descriptor sif.Descriptor) error {
    // ...
    payloadHash, err := descriptor.GetPayloadHash()
    if err != nil {
        return err
    }

    // Issue: No verification of the selected hash algorithm's cryptographic security.
    signature, err := sif.NewSignature(signedDataPart, payloadHash, crypto.SHA256)
    if err != nil {
        return err
    }

    if err := signature.Verify(certificate); err != nil {
        return err
    }
    // ...
}

Mitigation

To remediate the vulnerability, update the syslabs/sif package to version 2.8.1 or later by modifying the go.mod file in your Go project:

require (
	github.com/sylabs/sif/v2 v2.8.1
)

For those who cannot upgrade, an alternative is to independently validate that the hash algorithm(s) used for metadata digest(s) and signature hash are cryptographically secure. This can be done by checking the specific hash algorithm during the verification process:

import (
    "crypto"
    "github.com/sylabs/sif/v2/pkg/sif"
)

func isCryptographicallySecure(hash crypto.Hash) bool {
    // List of accepted secure hash algorithms.
    secureHashes := []crypto.Hash{
        crypto.SHA256,
        crypto.SHA384,
        crypto.SHA512,
    }

    for _, secure := range secureHashes {
        if hash == secure {
            return true
        }
    }

    return false
}

func verifyCustom(sifFile *sif.File, descriptor sif.Descriptor) error {
    // Custom implementation for verifying signature.
}

In conclusion, the affected syslabs/sif package undermines the integrity of digital signatures due to the use of insecure hash algorithms. To mitigate the issue, upgrade to version 2.8.1 of the package or beyond, or alternatively, independently validate the cryptographic security of the hash algorithm(s) used.

Original References

- SysLabs/sif GitHub Repository
- SIF Package Integrity
- CVE Details
- Singularity GitHub Repository

Timeline

Published on: 10/06/2022 18:16:00 UTC
Last modified on: 10/11/2022 05:15:00 UTC