{"id":"GHSA-26q8-h657-pf84","kind":"vulnerability","aliases":["GHSA-26q8-h657-pf84"],"related":[],"title":"Bundled root certificates trust compromised eMudhra (emSign) intermediate CAs","description":"### Summary\n\nBun's bundled root certificates included `emSign ECC Root CA - G3`. Eight eMudhra (emSign) intermediate CAs were revoked for key compromise in October 2026, and the six of them that issue TLS certificates chain to that root. Bun 1.4.3 and earlier accept certificates issued by those intermediates. The private keys have been independently recovered by multiple people and some have been disclosed publicly, so any attacker in the network path can impersonate any TLS server to Bun.\n\nBun 1.4.4 removes the root from the bundle and rejects any certificate chain that contains one of the eight compromised public keys.\n\nThis is a compromise of a certificate authority's keys, not a bug in Bun's certificate validation. Other projects that ship their own trust store were affected in the same way.\n\n### Details\n\nAny TLS client connection that uses Bun's default trust store is affected. That includes `fetch`, `bun install`, `bun add`, `bunx`, `node:https`, `node:tls`, `WebSocket`, `Bun.connect` and `fetch` over HTTP/3.\n\nA TLS server that sets `requestCert: true` without a `ca` also verifies client certificates against the default trust store, so it is affected in the same way.\n\nBun checks revocation only against a CRL passed in the `crl` option, so the CA's revocation of the intermediates does not protect affected versions by default.\n\nExecutables built with `bun build --compile` embed the Bun runtime and its trust store. An executable built with an affected version stays affected until it is rebuilt.\n\n### Impact\n\nAn attacker in the network path can present a forged certificate that Bun accepts as valid for any hostname. They can then read and modify the traffic. For `bun install` and `bunx` this includes the packages that are downloaded.\n\n### Patches\n\nUpgrade to Bun 1.4.4, and rebuild any `bun build --compile` executables with it.\n\nBun 1.4.4 has two changes:\n\n- **Three emSign roots are removed and the bundle is updated to NSS 3.131.1** (#46159, #46300). This removes `emSign ECC Root CA - G3`, `emSign Root CA - C1` and `emSign ECC Root CA - C3`. `emSign Root CA - G1` stays in the bundle, as it does in NSS 3.131.1.\n- **A chain that contains one of the eight compromised public keys fails with `CERT_REVOKED`** (#46300). The check matches the key rather than the certificate, and it applies whichever root the chain ends at. It therefore also covers cross-signed copies of the intermediates, roots loaded from the system store, `NODE_EXTRA_CA_CERTS`, `SSL_CERT_FILE`, `SSL_CERT_DIR`, and a `ca` option. It applies to TLS over TCP, the HTTP/3 client and `node:quic`, and to client certificates that a server verifies. `fetch` over HTTP/3 reports the failure as `HTTP3HandshakeFailed`. The list of keys is the one Node.js, Go and Chrome block.\n\n### Workarounds\n\nThere is no process-wide workaround for affected versions.\n\n- `--use-system-ca` and `NODE_USE_SYSTEM_CA=1` do not help. They add the system's certificates to the bundled ones and do not replace them.\n- Updating the operating system's certificates does not help, for the same reason.\n- Passing an explicit `ca` (or `tls.ca`) on a connection replaces the default trust store for that connection only. A list that leaves out the emSign roots protects that connection.\n- `bun install --cafile <path>` (or `--ca`) does the same for that install. `bunx` does not accept those flags before 1.4.4.\n- `cafile` under `[install]` in `bunfig.toml` does the same for `bun install`. In `~/.bunfig.toml` it also applies to `bunx`.\n\n### References\n\n- https://github.com/oven-sh/bun/pull/46159\n- https://github.com/oven-sh/bun/pull/46300\n- https://github.com/oven-sh/bun/issues/46526\n- Mozilla incident report: https://bugzilla.mozilla.org/show_bug.cgi?id=2083449\n- uv: https://github.com/astral-sh/uv/security/advisories/GHSA-hq85-5cpj-mr62\n- certifi: https://github.com/certifi/python-certifi/security/advisories/GHSA-6q48-6c7w-9gw2\n- Go: CVE-2026-111943\n- Rust: https://rustsec.org/advisories/RUSTSEC-2026-0381.html, https://rustsec.org/advisories/RUSTSEC-2026-0382.html, https://rustsec.org/advisories/RUSTSEC-2026-0383.html","summary":"Bun 1.4.3 and earlier ship a root certificate store that trusts intermediate certificate authorities from eMudhra (emSign) whose private keys were compromised and revoked. An attacker in the network path can present a forged certificate for any hostname and read or modify traffic, including packages downloaded by bun install.","severity":"high","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"bun","fixed":["1.4.4"],"affected":"< 1.4.4","ecosystem":"npm"}],"ecosystems":["npm"],"tags":["bun","cwe-295","javascript","node","runtime","self-hosted","tls","typescript"],"not_affected_if":["bun-1.4.4-or-later","explicit-ca-without-emsign-roots"],"how_to_check":"- Run `bun --version` and check whether it is below `1.4.4`.\n- Find `bun build --compile` executables built with an older Bun; they embed the old trust store until rebuilt.\n- Check whether any connection passes an explicit `ca` list that leaves out the emSign roots, since that connection is protected.","fix":"- Bun: upgrade to `1.4.4` and rebuild any `bun build --compile` executables with it.","status":"open","published_at":"2026-10-23T02:02:06+00:00","first_seen_at":"2026-11-09T22:53:15+00:00","triaged_at":"2026-11-09T22:58:56+00:00","updated_at":"2026-11-09T22:58:56+00:00","category":"runtime","confidence":0.8,"triage":{"at":"2026-11-09T22:58:56Z","model":"claude-haiku-5-5","output":{"fix":"- Bun: upgrade to `1.4.4` and rebuild any `bun build --compile` executables with it.","reach":"network","title":"Bun: bundled certificates trust compromised eMudhra CAs, enabling TLS impersonation","impact":"high","summary":"Bun 1.4.3 and earlier ship a root certificate store that trusts intermediate certificate authorities from eMudhra (emSign) whose private keys were compromised and revoked. An attacker in the network path can present a forged certificate for any hostname and read or modify traffic, including packages downloaded by bun install.","audience":"developers","category":"runtime","nicknames":[],"who_cares":["bun","javascript","typescript","node","tls","self-hosted"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"Attacker impersonates TLS servers and reads or alters traffic in transit","analyst_note":"","how_to_check":"- Run `bun --version` and check whether it is below `1.4.4`.\n- Find `bun build --compile` executables built with an older Bun; they embed the old trust store until rebuilt.\n- Check whether any connection passes an explicit `ca` list that leaves out the emSign roots, since that connection is protected.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["bun-1.4.4-or-later","explicit-ca-without-emsign-roots"],"who_is_affected":"Any application or tool that runs Bun 1.4.3 or earlier and makes TLS connections with the default trust store, including fetch, node:https, WebSocket, and bun install or bunx downloads. A TLS server that requests client certificates without a custom ca is affected too. Connections that pass an explicit ca list without the emSign roots are protected, and so is anyone already on 1.4.4.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"no","severity_if_unknown":"high"},"cost_usd":0.000942,"input_tokens":6131,"output_tokens":657,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-111943':681C '-2026':680C '-295':23B '/.bunfig.toml':648C '/advisories/rustsec-2026-0381.html,':685C '/astral-sh/uv/security/advisories/ghsa-hq85-5cpj-mr62':673C '/certifi/python-certifi/security/advisories/ghsa-6q48-6c7w-9gw2':677C '/oven-sh/bun/issues/46526':663C '/oven-sh/bun/pull/46159':657C '/oven-sh/bun/pull/46300':660C '/show_bug.cgi?id=2083449':669C '1':556C '1.4.3':33B,120C '1.4.4':160C,370C,381C,635C '2026':105C '26q8':12A,17A '3.131.1':397C,430C '46159':398C '46300':399C,446C 'accept':123C,340C,631C 'add':233C,561C 'affect':208C,226C,267C,295C,318C,321C,545C 'also':255C,467C,650C 'appli':458C,497C,651C 'attack':57B,147C,328C 'author':45B,188C 'block':535C 'bug':193C 'bugzilla.mozilla.org':668C 'bugzilla.mozilla.org/show_bug.cgi?id=2083449':667C 'build':303C,375C 'built':300C,315C 'bun':20A,21B,32B,79B,82C,119C,158C,159C,195C,220C,230C,232C,272C,302C,307C,339C,355C,369C,374C,380C,617C,645C 'bun.connect':240C 'bundl':1A,84C,166C,392C,424C,568C 'bunfig.toml':640C 'bunx':234C,358C,628C,653C 'c1':410C 'c3':416C 'ca':91C,254C,286C,405C,409C,415C,419C,484C,494C,550C,555C,591C,621C 'cafil':619C,636C 'cas':9A,97C 'cert':444C,485C,487C,490C 'certif':3A,39B,44B,66B,86C,114C,124C,170C,187C,197C,258C,337C,455C,511C,565C,580C 'certifi':674C 'chain':115C,171C,432C,462C 'chang':384C 'check':273C,448C 'chrome':534C 'client':216C,257C,504C,510C 'compil':304C,376C 'compromis':5A,53B,102C,178C,184C,439C 'connect':217C,596C,604C,616C 'contain':173C,434C 'copi':472C 'cover':468C 'crl':278C,282C 'cross':470C 'cross-sign':469C 'cve':679C 'cwe':22B 'default':222C,261C,298C,599C 'detail':213C 'dir':491C 'disclos':143C 'download':77B,365C 'earlier':35B,122C 'ecc':89C,403C,413C 'eight':93C,177C,438C 'emb':305C 'emsign':7A,48B,88C,95C,386C,402C,407C,412C,417C,612C 'emudhra':6A,47B,94C 'end':463C 'execut':299C,314C,377C 'explicit':590C 'extra':483C 'fail':442C 'failur':521C 'fetch':229C,242C,516C 'file':488C 'flag':633C 'forg':65B,336C 'g1':420C 'g3':92C,406C 'ghsa':11A,16A 'ghsa-26q8-h657-pf84':10A,15A 'github.com':656C,659C,662C,672C,676C 'github.com/astral-sh/uv/security/advisories/ghsa-hq85-5cpj-mr62':671C 'github.com/certifi/python-certifi/security/advisories/ghsa-6q48-6c7w-9gw2':675C 'github.com/oven-sh/bun/issues/46526':661C 'github.com/oven-sh/bun/pull/46159':655C 'github.com/oven-sh/bun/pull/46300':658C 'go':532C,678C 'h657':13A,18A 'help':559C,583C 'host':29B 'hostnam':69B,345C 'http/3':244C,503C,518C 'http3handshakefailed':523C 'https':236C,686C 'impact':326C 'imperson':153C 'incid':665C 'includ':75B,87C,228C,360C 'independ':134C 'instal':80B,231C,356C,618C,627C,638C,646C 'intermedi':8A,43B,96C,128C,291C,475C 'issu':112C,125C 'javascript':24B 'key':51B,101C,131C,180C,190C,441C,451C,527C 'leav':609C 'list':525C,607C 'load':477C 'match':449C 'modifi':73B,351C 'mozilla':664C 'multipl':137C 'network':60B,150C,331C 'node':25B,235C,237C,482C,506C,552C 'node.js':531C 'nss':396C,429C 'octob':104C 'one':174C,435C,530C,569C 'oper':577C 'option':283C,495C 'packag':76B,362C 'pass':279C,588C 'patch':366C 'path':61B,151C,332C 'peopl':138C 'pf84':14A,19A 'present':63B,334C 'privat':50B,130C 'process':541C 'process-wid':540C 'project':200C 'protect':294C,614C 'public':144C,179C,440C 'quic':507C 'rather':452C 'read':71B,349C 'reason':587C 'rebuild':372C 'rebuilt':325C 'recov':135C 'refer':654C 'reject':168C 'remov':161C,389C,401C 'replac':573C,597C 'report':519C,666C 'requestcert':250C 'revoc':274C,288C 'revok':55B,99C,445C 'root':2A,38B,85C,90C,118C,163C,387C,404C,408C,414C,418C,460C,476C,613C 'runtim':26B,308C 'rust':682C 'rustsec.org':684C 'rustsec.org/advisories/rustsec-2026-0381.html,':683C 'self':28B 'self-host':27B 'server':156C,247C,514C 'set':249C 'ship':36B,202C 'sign':471C 'six':108C 'ssl':486C,489C 'stay':320C,421C 'store':40B,206C,224C,263C,312C,481C,601C 'summari':81C 'system':480C,549C,554C,563C,578C 'tcp':501C 'therefor':466C 'three':385C 'tls':30B,113C,155C,215C,238C,246C,499C 'tls.ca':593C 'traffic':74B,353C 'true':251C 'trust':4A,42B,205C,223C,262C,311C,600C 'two':383C 'typescript':31B 'updat':394C,575C 'upgrad':367C 'use':219C,548C,553C 'use-system-ca':547C 'uv':670C 'valid':198C,342C 'verifi':256C,515C 'version':296C,319C,546C 'way':212C,271C 'websocket':239C 'whichev':459C 'whose':49B 'wide':542C 'without':252C 'workaround':536C,543C","nicknames":[],"mitigations":[],"who_affected":"Any application or tool that runs Bun 1.4.3 or earlier and makes TLS connections with the default trust store, including fetch, node:https, WebSocket, and bun install or bunx downloads. A TLS server that requests client certificates without a custom ca is affected too. Connections that pass an explicit ca list without the emSign roots are protected, and so is anyone already on 1.4.4.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["bun"],"ptokens":["bun"],"labels":["bun","cwe295","high","javascript","node","npm","runtime","selfhosted","tls","typescript"],"campaign_type":null,"search_a":"'26q8':12A,17A 'bun':20A 'bundl':1A 'cas':9A 'certif':3A 'compromis':5A 'emsign':7A 'emudhra':6A 'ghsa':11A,16A 'ghsa-26q8-h657-pf84':10A,15A 'h657':13A,18A 'intermedi':8A 'pf84':14A,19A 'root':2A 'trust':4A","search_b":"'-295':23B '1.4.3':33B 'attack':57B 'author':45B 'bun':21B,32B,79B 'certif':39B,44B,66B 'compromis':53B 'cwe':22B 'download':77B 'earlier':35B 'emsign':48B 'emudhra':47B 'forg':65B 'host':29B 'hostnam':69B 'includ':75B 'instal':80B 'intermedi':43B 'javascript':24B 'key':51B 'modifi':73B 'network':60B 'node':25B 'packag':76B 'path':61B 'present':63B 'privat':50B 'read':71B 'revok':55B 'root':38B 'runtim':26B 'self':28B 'self-host':27B 'ship':36B 'store':40B 'tls':30B 'traffic':74B 'trust':42B 'typescript':31B 'whose':49B","search_c":"'-111943':681C '-2026':680C '/.bunfig.toml':648C '/advisories/rustsec-2026-0381.html,':685C '/astral-sh/uv/security/advisories/ghsa-hq85-5cpj-mr62':673C '/certifi/python-certifi/security/advisories/ghsa-6q48-6c7w-9gw2':677C '/oven-sh/bun/issues/46526':663C '/oven-sh/bun/pull/46159':657C '/oven-sh/bun/pull/46300':660C '/show_bug.cgi?id=2083449':669C '1':556C '1.4.3':120C '1.4.4':160C,370C,381C,635C '2026':105C '3.131.1':397C,430C '46159':398C '46300':399C,446C 'accept':123C,340C,631C 'add':233C,561C 'affect':208C,226C,267C,295C,318C,321C,545C 'also':255C,467C,650C 'appli':458C,497C,651C 'attack':147C,328C 'author':188C 'block':535C 'bug':193C 'bugzilla.mozilla.org':668C 'bugzilla.mozilla.org/show_bug.cgi?id=2083449':667C 'build':303C,375C 'built':300C,315C 'bun':82C,119C,158C,159C,195C,220C,230C,232C,272C,302C,307C,339C,355C,369C,374C,380C,617C,645C 'bun.connect':240C 'bundl':84C,166C,392C,424C,568C 'bunfig.toml':640C 'bunx':234C,358C,628C,653C 'c1':410C 'c3':416C 'ca':91C,254C,286C,405C,409C,415C,419C,484C,494C,550C,555C,591C,621C 'cafil':619C,636C 'cas':97C 'cert':444C,485C,487C,490C 'certif':86C,114C,124C,170C,187C,197C,258C,337C,455C,511C,565C,580C 'certifi':674C 'chain':115C,171C,432C,462C 'chang':384C 'check':273C,448C 'chrome':534C 'client':216C,257C,504C,510C 'compil':304C,376C 'compromis':102C,178C,184C,439C 'connect':217C,596C,604C,616C 'contain':173C,434C 'copi':472C 'cover':468C 'crl':278C,282C 'cross':470C 'cross-sign':469C 'cve':679C 'default':222C,261C,298C,599C 'detail':213C 'dir':491C 'disclos':143C 'download':365C 'earlier':122C 'ecc':89C,403C,413C 'eight':93C,177C,438C 'emb':305C 'emsign':88C,95C,386C,402C,407C,412C,417C,612C 'emudhra':94C 'end':463C 'execut':299C,314C,377C 'explicit':590C 'extra':483C 'fail':442C 'failur':521C 'fetch':229C,242C,516C 'file':488C 'flag':633C 'forg':336C 'g1':420C 'g3':92C,406C 'github.com':656C,659C,662C,672C,676C 'github.com/astral-sh/uv/security/advisories/ghsa-hq85-5cpj-mr62':671C 'github.com/certifi/python-certifi/security/advisories/ghsa-6q48-6c7w-9gw2':675C 'github.com/oven-sh/bun/issues/46526':661C 'github.com/oven-sh/bun/pull/46159':655C 'github.com/oven-sh/bun/pull/46300':658C 'go':532C,678C 'help':559C,583C 'hostnam':345C 'http/3':244C,503C,518C 'http3handshakefailed':523C 'https':236C,686C 'impact':326C 'imperson':153C 'incid':665C 'includ':87C,228C,360C 'independ':134C 'instal':231C,356C,618C,627C,638C,646C 'intermedi':96C,128C,291C,475C 'issu':112C,125C 'key':101C,131C,180C,190C,441C,451C,527C 'leav':609C 'list':525C,607C 'load':477C 'match':449C 'modifi':351C 'mozilla':664C 'multipl':137C 'network':150C,331C 'node':235C,237C,482C,506C,552C 'node.js':531C 'nss':396C,429C 'octob':104C 'one':174C,435C,530C,569C 'oper':577C 'option':283C,495C 'packag':362C 'pass':279C,588C 'patch':366C 'path':151C,332C 'peopl':138C 'present':334C 'privat':130C 'process':541C 'process-wid':540C 'project':200C 'protect':294C,614C 'public':144C,179C,440C 'quic':507C 'rather':452C 'read':349C 'reason':587C 'rebuild':372C 'rebuilt':325C 'recov':135C 'refer':654C 'reject':168C 'remov':161C,389C,401C 'replac':573C,597C 'report':519C,666C 'requestcert':250C 'revoc':274C,288C 'revok':99C,445C 'root':85C,90C,118C,163C,387C,404C,408C,414C,418C,460C,476C,613C 'runtim':308C 'rust':682C 'rustsec.org':684C 'rustsec.org/advisories/rustsec-2026-0381.html,':683C 'server':156C,247C,514C 'set':249C 'ship':202C 'sign':471C 'six':108C 'ssl':486C,489C 'stay':320C,421C 'store':206C,224C,263C,312C,481C,601C 'summari':81C 'system':480C,549C,554C,563C,578C 'tcp':501C 'therefor':466C 'three':385C 'tls':113C,155C,215C,238C,246C,499C 'tls.ca':593C 'traffic':353C 'true':251C 'trust':205C,223C,262C,311C,600C 'two':383C 'updat':394C,575C 'upgrad':367C 'use':219C,548C,553C 'use-system-ca':547C 'uv':670C 'valid':198C,342C 'verifi':256C,515C 'version':296C,319C,546C 'way':212C,271C 'websocket':239C 'whichev':459C 'wide':542C 'without':252C 'workaround':536C,543C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-10-23T02:02:06+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"ghsa-repo","external_id":"GHSA-26q8-h657-pf84","url":"https://github.com/oven-sh/bun/security/advisories/GHSA-26q8-h657-pf84","severity":"high","published_at":"2026-10-23T02:02:06+00:00","modified_at":"2026-10-23T02:02:06+00:00","first_seen_at":"2026-11-09T22:53:15+00:00","fetched_at":"2026-11-09T22:53:15+00:00","note":null}],"documents":[{"id":667,"url":"https://news.ycombinator.com/item?id=50206018","title":"Bun 1.4.4 removes compromised eMudhra certs","kind":"post","source":"hackernews","publisher":null,"text":"Bun 1.4.4 removes compromised eMudhra certs\nhttps://github.com/oven-sh/bun/security/advisories/GHSA-26q8-h657-pf84\n\n3 points, 1 comments on Hacker News","published_at":"2026-10-23T08:33:54+00:00","relation":"discussion","confidence":null,"note":null},{"id":110410,"url":"https://github.com/oven-sh/bun/security/advisories/GHSA-26q8-h657-pf84","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa-repo","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"}],"disclosures":[],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}