openssl/openssl
Ver no GitHubOpenSSL doesn't validate version field when parsing RSA PRIVATE KEY PEM
Open
#26.467 aberto em 18 de jan. de 2025
branch: mastergood first issuetriaged: feature
Métricas do repositório
- Stars
- (30.157 stars)
- Métricas de merge de PR
- (Nenhuma PRs mesclada em 30d)
Description
Minimal reproducer:
#include <stdio.h>
#include <stdbool.h>
#include <openssl/ssl.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
#include <openssl/err.h>
static void openssl_assert(const char *op, bool condition) {
if (!condition) {
fprintf(stderr, "Operation failed: %s\n", op);
ERR_print_errors_fp(stderr);
exit(1);
}
}
int main(void) {
static const char key_buf[] =
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEpAIBEQKCAQEAubZR/vxN1MmxwDEu5p8IA5kNWlOXhd0U8faIDZGY7h9xs7q7\n"
"Hr6Xd4azC+oXDyS3oOexFvLGkIzzdJI5hJJBh4benU4PXz5W176euXHT+KT4EgV8\n"
"+fkFO4KdHFTRo0D+XJCm4iilhx2pAHcBQbTG5vKYQJcYyxZGek9f9jiCsgQlUCj0\n"
"l0Xe3Hyktcum14rPMrZQ8Gv4GGLtoIVqFOh2ftQIY0IoSm+XUulkNfcRmgXMMiCp\n"
"VHdKkx2+vh8asN+drq7bEydBw7XEjhoUJszZVPubUUDBTa7Jp5vpx8jlBhDftInH\n"
"U5mZz8FKx1dlurSuio312Ww940wSQ1saAs9uyQIDAQABAoIBAAmnaNIfWIZtaQrr\n"
"ePDZJzKqA/qEP5YLB5nfwx59c/HmUDlTxYK+zU3pLSk7OoakKyg3Ux/fxU23Xg0w\n"
"cBgBqFwSDpl7zisZKQI0cQ4v1MvnUNP9qrZYk8U5BXohuKIgG05Bi23/R0I5Bajg\n"
"sX/dFL07CDTMsKfCA9jmLmq0xlUtm3d4R8h050OsFZQqIYFrsXeRkhXuI1Bk+wp7\n"
"O6qvrBSS4psvyA3Ba2M1Jdg+7XP6R6VamJQUilA1jrlMYrGehPPX2vhmzWpgaSDV\n"
"S6QdeqZI53fVJp/gCxKoz1zPgj9iwejcRC7Dp+M1aRP0RJGbqkpccpk0WBdUO0rd\n"
"X5waR38CgYEA+DN/vNS1ThTUImiJcl2dxxPkDIfmLOGIalF8cps9Ez3FGb+wJggX\n"
"iFCdK1A7wJZr3GfEV3HkH5hEzuG+losyY3NdbEfZgdrP3h/iEQxKy/5lZZmJC48T\n"
"HCDSRokZWfRdBtT63yBflPnqBQxmHv3HYNdHGhljvxYzODfvbcT4268CgYEAv4wq\n"
"1UrPZ/i2h4SfkezkdhkB6KvIsLyGBPVeZK1BOmIC27KOrARj+HgRwcqCaw7q+1PR\n"
"FbUN5ad190xenPgWG/wDD15AJmQ4jqHvfQrehVWeTmjO9RnLT1guxB+ZQknYuGCn\n"
"Qz8GEjIoJ6h7PMDXhQdYEbdrzLyQ/xU6EVkvowcCgYEA4M3MUd0bBkjJRw0GCOcQ\n"
"BANZF5xzd40jAKEjpa5DqEzXXBYJ1riXj+jsIhH+vNXBhhUaedV3OMKy9+rxs+sJ\n"
"zZftMyj0sa/dfKPGH4jRqmiVsGta/HQva9eyfR6qLpatN4XqX/QzfnzJYJ81U7aq\n"
"QmVaSiJa/PV/mNjY7MRuXpMCgYEAkErtpVlCnocMMVAlyI6Ul6ZE+toVR5Xsu2V/\n"
"YwXkwi89CfUbZtez22PPtJVx42YMe6FrOxf1zQ92XQGJsGNufEw+neAZIRKUTFYO\n"
"i7qZYAXcSCLJ7Hcu4amDKTjIgdgRSut8dLrQPvrLpvxTQbPfZpXesRHkQgm2jIGY\n"
"CaOOsBcCgYA3ijrhl4w4Hc47SGsDhgHPBt+ndof9zS1WcyOAv/TzLuwgAnA0vNU7\n"
"6AFi5AVKt/79vD5f6SOqgTDSyasB1qcP2jYV8GaIbqYQ4Gwpz1wuBkmkDKk28pC3\n"
"ec2eK8O4cJUmZn91oQFuJorjuVAa5GluyMGvCdxWeAQVH96xSG7lEg==\n"
"-----END RSA PRIVATE KEY-----\n";
const size_t key_len = sizeof(key_buf);
// Create BIO from memory buffer
BIO *bio = BIO_new_mem_buf(key_buf, key_len);
openssl_assert("Create memory BIO", bio != NULL);
// Decode RSA private key
RSA *rsa = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
openssl_assert("Decode PKCS#8 private key", rsa != NULL);
// Key loaded successfully at this point
printf("Private key loaded successfully\n");
// Cleanup
RSA_free(pkey);
BIO_free(bio);
return 0;
}
ASCII representation of the payload:
SEQUENCE {
INTEGER { 17 }
INTEGER { `00b9b651fefc4dd4c9b1c0312ee69f0803990d5a539785dd14f1f6880d9198ee1f71b3babb1ebe977786b30bea170f24b7a0e7b116f2c6908cf37492398492418786de9d4e0f5f3e56d7be9eb971d3f8a4f812057cf9f9053b829d1c54d1a340fe5c90a6e228a5871da900770141b4c6e6f298409718cb16467a4f5ff63882b204255028f49745dedc7ca4b5cba6d78acf32b650f06bf81862eda0856a14e8767ed4086342284a6f9752e96435f7119a05cc3220a954774a931dbebe1f1ab0df9daeaedb132741c3b5c48e1a1426ccd954fb9b5140c14daec9a79be9c7c8e50610dfb489c7539999cfc14ac75765bab4ae8a8df5d96c3de34c12435b1a02cf6ec9` }
INTEGER { 65537 }
INTEGER { `09a768d21f58866d690aeb78f0d92732aa03fa843f960b0799dfc31e7d73f1e6503953c582becd4de92d293b3a86a42b2837531fdfc54db75e0d30701801a85c120e997bce2b19290234710e2fd4cbe750d3fdaab65893c539057a21b8a2201b4e418b6dff47423905a8e0b17fdd14bd3b0834ccb0a7c203d8e62e6ab4c6552d9b777847c874e743ac15942a21816bb177919215ee235064fb0a7b3baaafac1492e29b2fc80dc16b633525d83eed73fa47a55a9894148a50358eb94c62b19e84f3d7daf866cd6a606920d54ba41d7aa648e777d5269fe00b12a8cf5ccf823f62c1e8dc442ec3a7e3356913f444919baa4a5c7299345817543b4add5f9c1a477f` }
INTEGER { `00f8337fbcd4b54e14d4226889725d9dc713e40c87e62ce1886a517c729b3d133dc519bfb026081788509d2b503bc0966bdc67c45771e41f9844cee1be968b3263735d6c47d981dacfde1fe2110c4acbfe656599890b8f131c20d246891959f45d06d4fadf205f94f9ea050c661efdc760d7471a1963bf16333837ef6dc4f8dbaf` }
INTEGER { `00bf8c2ad54acf67f8b687849f91ece4761901e8abc8b0bc8604f55e64ad413a6202dbb28eac0463f87811c1ca826b0eeafb53d115b50de5a775f74c5e9cf8161bfc030f5e402664388ea1ef7d0ade85559e4e68cef519cb4f582ec41f994249d8b860a7433f0612322827a87b3cc0d785075811b76bccbc90ff153a11592fa307` }
INTEGER { `00e0cdcc51dd1b0648c9470d0608e710040359179c73778d2300a123a5ae43a84cd75c1609d6b8978fe8ec2211febcd5c186151a79d57738c2b2f7eaf1b3eb09cd97ed3328f4b1afdd7ca3c61f88d1aa6895b06b5afc742f6bd7b27d1eaa2e96ad3785ea5ff4337e7cc9609f3553b6aa42655a4a225afcf57f98d8d8ecc46e5e93` }
INTEGER { `00904aeda559429e870c315025c88e9497a644fada154795ecbb657f6305e4c22f3d09f51b66d7b3db63cfb49571e3660c7ba16b3b17f5cd0f765d0189b0636e7c4c3e9de0192112944c560e8bba996005dc4822c9ec772ee1a9832938c881d8114aeb7c74bad03efacba6fc5341b3df6695deb111e44209b68c819809a38eb017` }
INTEGER { `378a3ae1978c381dce3b486b038601cf06dfa77687fdcd2d56732380bff4f32eec20027034bcd53be80162e4054ab7fefdbc3e5fe923aa8130d2c9ab01d6a70fda3615f066886ea610e06c29cf5c2e0649a40ca936f290b779cd9e2bc3b8709526667f75a1016e268ae3b9501ae4696ec8c1af09dc567804151fdeb1486ee512` }
}
RFC for this format indicating that 17 is not a valid format here: https://datatracker.ietf.org/doc/html/rfc8017#appendix-A.1.2