{"id":"CVE-2026-106123","kind":"vulnerability","aliases":["CVE-2026-106123","GHSA-h6w7-qmcm-q6xr"],"related":[],"title":"RabbitMQ Java client: plaintext broker credentials leaked in exception message from ConnectionFactoryConfigurator.load()","description":"### Summary\nWhen property-file/Map-based `ConnectionFactory` setup fails while parsing the `uri` key, the library wraps the underlying exception with the raw connection string — including the plaintext username and password — baked verbatim into the new exception's message.\n\n### Details\n`ConnectionFactoryConfigurator.load(ConnectionFactory, Map<String,String>, String)` (`src/main/java/com/rabbitmq/client/ConnectionFactoryConfigurator.java`, lines 142-155):\n\n    String uri = properties.get(prefix + \"uri\");\n    if (uri != null) {\n        try {\n            cf.setUri(uri);\n        } catch (URISyntaxException e) {\n            throw new IllegalArgumentException(\"Error while setting AMQP URI: \" + uri, e);\n        } catch (NoSuchAlgorithmException e) {\n            throw new IllegalArgumentException(\"Error while setting AMQP URI: \" + uri, e);\n        } catch (KeyManagementException e) {\n            throw new IllegalArgumentException(\"Error while setting AMQP URI: \" + uri, e);\n        }\n    }\n\n`uri` is the full AMQP URI — `amqp(s)://username:password@host:port/vhost` — concatenated verbatim into the exception message on any of the three catch branches. No masking/redaction exists anywhere in this class or in `ConnectionFactory.setUri()`. This is the library's documented Spring-Boot/ops-config entry point (`ConnectionFactory.load(...)`, available since 4.4.0), not obscure internal code.\n\nRabbitMQ's own AMQP URI spec (rabbitmq.com/docs/uri-spec) explicitly warns the password \"should avoid leaking... the full URI should not appear in exception messages or log records.\" A sibling method twenty lines away (`ConnectionFactory.setUri(URI)`) already avoids this exact mistake for a different malformed-URI case — this path wasn't caught by that same care.\n\nNote: `KeyManagementException` is declared in the throws clause but not actually reachable via the current `setUri(String)` → `setUri(URI)` call chain — the two real, reachable leak surfaces are the `URISyntaxException` branch (trivial, deterministic, scheme-independent) and the `NoSuchAlgorithmException` branch (real but narrower — `amqps://` only, requires a restricted/FIPS-style default TLS provider).\n\n### PoC\n    Map<String, String> props = new HashMap<>();\n    props.put(\"uri\", \"amqp://svc-account:P@ssW0rd With Space!@broker.internal:5672/prod\");\n    ConnectionFactory cf = new ConnectionFactory();\n    ConnectionFactoryConfigurator.load(cf, props, \"\");\n\nThrows:\n\n    java.lang.IllegalArgumentException: Error while setting AMQP URI: amqp://svc-account:P@ssW0rd With Space!@broker.internal:5672/prod\n\nA password containing a space is entirely ordinary under common corporate password policies, and `java.net.URI` rejects such input outright — this isn't a contrived edge case.\n\n### Impact\nDefault Spring Boot startup-failure logging, an APM/error tracker, a CI job log, or an engineer pasting a stack trace into an internal or public ticket now holds the plaintext broker password, in a system typically far less access-controlled than wherever the credential is normally stored. Note the underlying `URISyntaxException` also carries the same string in its own message, chained as the cause of RabbitMQ's `IllegalArgumentException` — so removing RabbitMQ's own `+ uri` concatenation alone would not fully close this; the raw secret-bearing string also shouldn't be handed to `new URI()` for error-reporting purposes at all.\n\nSuggested fix: don't include the raw `uri` string in the wrapped exception's message — redact the userinfo component (or omit the URI entirely) before including it in any exception text.","summary":"The RabbitMQ Java client (amqp-client) puts the full AMQP connection string, including the plaintext broker username and password, into an exception message when a uri config key fails to parse. Anyone who can read startup logs, error trackers, CI logs or pasted stack traces can recover the broker credentials.","severity":"medium","cvss":5.7,"epss":0.0015800000401213765,"exploited":false,"exploited_at":null,"products":[{"name":"com.rabbitmq:amqp-client","fixed":["5.35.0"],"affected":"<= 5.34.0","ecosystem":"maven"},{"name":"vmware rabbitmq java client","fixed":["5.35.0"],"affected":"< 5.35.0","ecosystem":"vendor"}],"ecosystems":["maven","vendor"],"tags":["cwe-209","java","maven","package","rabbitmq","spring-boot"],"not_affected_if":["amqp-client-above-5.34.0","uri-not-used-for-config"],"how_to_check":"Check whether the project depends on com.rabbitmq:amqp-client at 5.34.0 or earlier, e.g. with mvn dependency:tree | grep amqp-client or by reading pom.xml/build.gradle.\nIf it does, look for ConnectionFactoryConfigurator.load or ConnectionFactory.load called with a uri key taken from properties or Spring config.","fix":"Upgrade com.rabbitmq:amqp-client to 5.35.0 or later.\nUntil then, rotate the broker password of any account whose URI was logged and scrub existing logs and tickets that contain it.","status":"open","published_at":"2026-10-06T19:17:43+00:00","first_seen_at":"2026-10-23T19:11:32+00:00","triaged_at":"2026-10-23T19:58:11+00:00","updated_at":"2026-10-23T23:44:52+00:00","category":"package","confidence":0.85,"triage":{"at":"2026-10-23T19:58:11Z","model":"claude-haiku-5-5","output":{"fix":"Upgrade com.rabbitmq:amqp-client to 5.35.0 or later.\nUntil then, rotate the broker password of any account whose URI was logged and scrub existing logs and tickets that contain it.","summary":"The RabbitMQ Java client (amqp-client) puts the full AMQP connection string, including the plaintext broker username and password, into an exception message when a uri config key fails to parse. Anyone who can read startup logs, error trackers, CI logs or pasted stack traces can recover the broker credentials.","category":"package","who_cares":["java","spring-boot","rabbitmq","maven"],"confidence":0.85,"analyst_note":"","how_to_check":"Check whether the project depends on com.rabbitmq:amqp-client at 5.34.0 or earlier, e.g. with mvn dependency:tree | grep amqp-client or by reading pom.xml/build.gradle.\nIf it does, look for ConnectionFactoryConfigurator.load or ConnectionFactory.load called with a uri key taken from properties or Spring config.\nunknown for any other check.","needs_analyst":false,"not_affected_if":["amqp-client-above-5.34.0","uri-not-used-for-config"],"severity_if_unknown":"medium"},"cost_usd":0.000549,"input_tokens":3319,"output_tokens":434,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-106123':15A,23A '-155':141C '-2026':14A,22A '-209':33B '/docs/uri-spec)':255C '/map-based':97C '/ops-config':236C '/prod':372C,396C '/username':200C '142':140C '4.4.0':242C 'access':464C 'access-control':463C 'account':365C,389C 'actual':314C 'alon':501C 'alreadi':283C 'also':477C,513C 'amqp':26A,46B,51B,162C,175C,188C,196C,198C,250C,385C 'amqp-client':25A,45B 'anyon':73B 'anywher':220C 'apm/error':432C 'appear':268C 'avail':240C 'avoid':261C,284C 'away':280C 'bake':123C 'bear':511C 'boot':40B,235C,426C 'branch':216C,334C,343C 'broker':5A,57B,90B,455C 'broker.internal:5672':371C,395C 'broker.internal:5672/prod':370C,394C 'call':323C 'care':303C 'carri':478C 'case':294C,422C 'catch':153C,166C,179C,215C 'caught':299C 'caus':489C 'cf':374C,378C 'cf.seturi':151C 'chain':324C,486C 'ci':81B,435C 'class':223C 'claus':311C 'client':3A,27A,31A,44B,47B 'close':505C 'code':246C 'com.rabbitmq':24A 'common':406C 'compon':546C 'concaten':204C,500C 'config':68B 'connect':52B,115C 'connectionfactori':98C,133C,373C,376C 'connectionfactory.load':239C 'connectionfactory.seturi':226C,281C 'connectionfactoryconfigurator.load':12A,132C,377C 'contain':399C 'contriv':420C 'control':465C 'corpor':407C 'credenti':6A,91B,469C 'current':318C 'cve':13A,21A 'cwe':32B 'declar':307C 'default':351C,424C 'detail':131C 'determinist':336C 'differ':290C 'document':232C 'e':155C,165C,168C,178C,181C,191C 'edg':421C 'engin':440C 'entir':403C,551C 'entri':237C 'error':79B,159C,172C,185C,382C,523C 'error-report':522C 'exact':286C 'except':9A,63B,111C,128C,208C,270C,540C,557C 'exist':219C 'explicit':256C 'fail':70B,100C 'failur':429C 'far':461C 'file':96C 'fix':529C 'full':50B,195C,264C 'fulli':504C 'ghsa':17A 'ghsa-h6w7-qmcm-q6xr':16A 'h6w7':18A 'hand':517C 'hashmap':360C 'hold':452C 'host':202C 'illegalargumentexcept':158C,171C,184C,493C 'impact':423C 'includ':54B,117C,532C,553C 'independ':339C 'input':414C 'intern':245C,447C 'isn':417C 'java':2A,30A,34B,43B 'java.lang.illegalargumentexception':381C 'java.net.uri':411C 'job':436C 'key':69B,105C 'keymanagementexcept':180C,305C 'leak':7A,262C,329C 'less':462C 'librari':107C,230C 'line':139C,279C 'log':78B,82B,273C,430C,437C 'malform':292C 'malformed-uri':291C 'map':134C,355C 'masking/redaction':218C 'maven':35B 'messag':10A,64B,130C,209C,271C,485C,542C 'method':277C 'mistak':287C 'narrow':346C 'new':127C,157C,170C,183C,359C,375C,519C 'normal':471C 'nosuchalgorithmexcept':167C,342C 'note':304C,473C 'null':149C 'obscur':244C 'omit':548C 'ordinari':404C 'outright':415C 'p':366C,390C 'packag':36B 'pars':72B,102C 'password':60B,122C,201C,259C,398C,408C,456C 'past':84B,441C 'path':296C 'plaintext':4A,56B,119C,454C 'poc':354C 'point':238C 'polici':409C 'port/vhost':203C 'prefix':145C 'prop':358C,379C 'properti':95C 'properties.get':144C 'property-fil':94C 'props.put':361C 'provid':353C 'public':449C 'purpos':525C 'put':48B 'q6xr':20A 'qmcm':19A 'rabbitmq':1A,29A,37B,42B,247C,491C,496C 'rabbitmq.com':254C 'rabbitmq.com/docs/uri-spec)':253C 'raw':114C,508C,534C 'reachabl':315C,328C 'read':76B 'real':327C,344C 'record':274C 'recov':88B 'redact':543C 'reject':412C 'remov':495C 'report':524C 'requir':348C 'restricted/fips-style':350C 'scheme':338C 'scheme-independ':337C 'secret':510C 'secret-bear':509C 'set':161C,174C,187C,384C 'setup':99C 'seturi':319C,321C 'shouldn':514C 'sibl':276C 'sinc':241C 'space':369C,393C,401C 'spec':252C 'spring':39B,234C,425C 'spring-boot':38B,233C 'src/main/java/com/rabbitmq/client/connectionfactoryconfigurator.java':138C 'ssw0rd':367C,391C 'stack':85B,443C 'startup':77B,428C 'startup-failur':427C 'store':472C 'string':53B,116C,135C,136C,137C,142C,320C,356C,357C,481C,512C,536C 'suggest':528C 'summari':92C 'surfac':330C 'svc':364C,388C 'svc-account':363C,387C 'system':459C 'text':558C 'three':214C 'throw':156C,169C,182C,310C,380C 'ticket':450C 'tls':352C 'trace':86B,444C 'tracker':80B,433C 'tri':150C 'trivial':335C 'twenti':278C 'two':326C 'typic':460C 'under':110C,475C 'uri':67B,104C,143C,146C,148C,152C,163C,164C,176C,177C,189C,190C,192C,197C,251C,265C,282C,293C,322C,362C,386C,499C,520C,535C,550C 'urisyntaxexcept':154C,333C,476C 'userinfo':545C 'usernam':58B,120C 'verbatim':124C,205C 'via':316C 'vmware':28A 'warn':257C 'wasn':297C 'wherev':467C 'would':502C 'wrap':108C,539C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-06T19:17:43+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-h6w7-qmcm-q6xr","url":"https://github.com/advisories/GHSA-h6w7-qmcm-q6xr","severity":"medium","published_at":"2026-10-07T16:19:22+00:00","modified_at":"2026-10-19T19:27:25+00:00","first_seen_at":"2026-10-23T19:11:32+00:00","fetched_at":"2026-10-23T19:11:32+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-106123","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-106123","severity":null,"published_at":"2026-10-06T19:17:43+00:00","modified_at":"2026-10-19T20:17:46+00:00","first_seen_at":"2026-10-23T23:44:52+00:00","fetched_at":"2026-10-23T23:44:52+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}