CSR con byte null in loro

1

Secondo l'articolo di wikipedia.org sui certificati X.509 , " Ci sono implementazioni errori con X.509 che consentono ad esempio nomi di oggetti falsificati che utilizzano stringhe con terminazione nulla Marlinspike Blackhat 2009 o attacchi di iniezioni di codice nei certificati. "La mia domanda è ... come posso creare un CSR con byte null al loro interno?

Ecco un CSR che ne contiene uno:

-----BEGIN CERTIFICATE REQUEST-----
MIIBSTCBtQIBADAQMQ4wDAYDVQQKDAVhYgBjZDCBnTALBgkqhkiG9w0BAQEDgY0A
MIGJAoGBALoqjrGPCxX2oWX8APXhB3dzKJAXWHKWSlMWDw1whCP+EpsdFY2pTq+D
RnX8wRIP2yssIii/4FwsDxjcjlYMpSqYBPnEq3Lql/7LeW5ulLn4wk4Gnd4B55WP
BLveMNCORZXtE5rNJISTRMHYZKp7sLOPFlE3Gb5G/o/rkxSqOKOPAgMBAAEwCwYJ
KoZIhvcNAQEFA4GBAB0CX/T2wBTHHE6dcCFwzXsVkqkoewQbLjDLoAjCBy7nFrCI
6+kLPj7zcYi6f+Jg+OcFMl0Oat+2iO7OARSib3S0WyuAFpJQQwZIiG9RISy2HF1A
jQPuWvOan1GsY74Dn0kac6BIaWlY0/9h/iIcl4BiUaFrW+xUinKGWofsdq8l
-----END CERTIFICATE REQUEST-----

Secondo asn1parse il valore corrispondente a organizationName ha una lunghezza di 5 anche se la stringa visualizzata ha un lunghezza di quattro. Il fatto è che c'è un byte nullo tra l'ab e il cd. Quella CSR è stata generata con una libreria chiamata phpseclib, ma mi piacerebbe sapere come generare CSR simili con OpenSSL o qualche altro strumento più standardizzato.

Ho provato a farlo ma non ha funzionato:

openssl req -new -key privkey.pem -out test.csr -subj "/O=ab
-----BEGIN CERTIFICATE REQUEST-----
MIICVzCCAT8CAQAwEjEQMA4GA1UEChMHYWIwMDBjZDCCASIwDQYJKoZIhvcNAQEB
BQADggEPADCCAQoCggEBAKe9z81r0pvpqN98WinJVAphD0bRqi1W6OrEh9rx0DPO
RILofZwLP11d8vot19VMHBqB+kQuhtWKc/2Te+F1fgy1NJjcF+tjErE038zMd4O6
sU7QiVuFKRceznaXiL2BKm5nCR5FBMj2gBu2WJ61mUKEkNYEvj7QtcMc/VUTYISq
D2DFoGmSjgltCtUyMqaSGtS6f2fqHFBvxVwLBDm+XSYYLrEREk2PmM1RbFY1b9fO
lKnrvRIN4X+RbqG9iF88Ax5T0L2/D1OjLD24eFY8m/ecrsMwxCAa9FL+oKIvT7M0
OGK+LWOkPpjKwegnppFYGOCEfLBDocSgD8z2AuV24usCAwEAAaAAMA0GCSqGSIb3
DQEBBQUAA4IBAQBmQwFqS8L4YO17hpTZTr/mKq0Mgzzf8PCI6d1OtRgKUM5LbFBX
WqCJSUzSrkCGQdMdFA9l20jw91gxaeLiEDbAS+1I8agel/TD6Hic5457HjyGbPx4
usqm0/c1/JRreG/1dyh2K6/TFPIN8dN++dLohmZlRWZdIMC0D/KNls5M++DiWqw3
J5S24BWIC6FOUsAs5EImd30+s4wXcL+uqlRmyQVZ3C+JI8ZBl5HuIKCLmS2d3rhG
/CBwlZHH4fyeYUpeWec6HUNjfvnJ8amDFyKPlbTgcSSEpXBBPGP4EJ+zrWFjZRe3
YDCxZ0RdBHjKsYzbJZDJEOe9YML5HqoXY1pr
-----END CERTIFICATE REQUEST-----
0cd"

Questo mi ha dato questo:

-----BEGIN CERTIFICATE REQUEST-----
MIIBSTCBtQIBADAQMQ4wDAYDVQQKDAVhYgBjZDCBnTALBgkqhkiG9w0BAQEDgY0A
MIGJAoGBALoqjrGPCxX2oWX8APXhB3dzKJAXWHKWSlMWDw1whCP+EpsdFY2pTq+D
RnX8wRIP2yssIii/4FwsDxjcjlYMpSqYBPnEq3Lql/7LeW5ulLn4wk4Gnd4B55WP
BLveMNCORZXtE5rNJISTRMHYZKp7sLOPFlE3Gb5G/o/rkxSqOKOPAgMBAAEwCwYJ
KoZIhvcNAQEFA4GBAB0CX/T2wBTHHE6dcCFwzXsVkqkoewQbLjDLoAjCBy7nFrCI
6+kLPj7zcYi6f+Jg+OcFMl0Oat+2iO7OARSib3S0WyuAFpJQQwZIiG9RISy2HF1A
jQPuWvOan1GsY74Dn0kac6BIaWlY0/9h/iIcl4BiUaFrW+xUinKGWofsdq8l
-----END CERTIFICATE REQUEST-----

es. the organizationName è ab000cd - not ab \ 00cd.

    
posta neubert 12.06.2014 - 15:51
fonte

1 risposta

4

Queste cose sono normalmente fatte a livello di programmazione. Le app da riga di comando di OpenSSL sono limitate in molti modi e non danno accesso a tutta la potenza della libreria sottostante. Se osservi il codice sorgente , troverai l'implementazione del comando req in apps/req.c . Per l'analisi del nome del soggetto, tale comando si basa sulla funzione parse_name() (definita in apps/apps.c ). Quella funzione crea internamente gli elementi nome come tante stringhe C con terminazione null, che, per definizione, non possono contenere un byte null. Pertanto, nessun modo possibile per ottenere ciò che cerchi con lo strumento da solo.

Quindi un'opzione è semplicemente scaricare il codice sorgente di OpenSSL, patch apps/req.c per includere un byte null dove lo vuoi, compilarlo ed eseguirlo. Ciò richiederà un po 'di conoscenza di C. Dovrai utilizzare la funzione X509_NAME_add_entry_by_txt () (o uno dei suoi accoliti), con un parametro len esplicito (non -1) da utilizzare come "stringa" una sequenza di byte che include il byte null. Se guardi parse_name() in apps/apps.c , vedrai che richiama X509_NAME_add_entry_by_NID() con len impostato su -1: questo è il punto esatto che vorresti cambiare.

Un'altra opzione è quella di generare una richiesta di certificato "normale", con un'altra lettera in cui si desidera avere il byte null (ad esempio una "Z"). Quindi, assicurati di convertire la tua richiesta in formato binario ("DER"); quindi utilizzare un editor di file binario per sostituire la 'Z' con un byte di valore 0; quindi ricalcolare la firma in modo che corrisponda ai nuovi contenuti della richiesta. Questo ultimo passo può essere fatto con gli strumenti di base della riga di comando di Linux ( dd per la chirurgia dei file, sha1sum per ottenere un nuovo hash, dc per eseguire il grande intero aritmetico) ma devi padroneggiare sia ASN.1 / DER e PKCS # 1 , e se lo facessi, non avresti fatto la domanda che hai chiesto.

    
risposta data 12.06.2014 - 16:24
fonte

Leggi altre domande sui tag