{"id":"CVE-2026-121819","kind":"vulnerability","aliases":["CVE-2026-121819"],"related":[],"title":"armeria-xds: symlink check lets control plane read files outside allowed directories","description":"A vulnerability has been identified in armeria-xds versions 1.40.0 through 1.42.0, where DataSourcePolicy checks filename containment without resolving symbolic links, allowing a compromised or semi-trusted xDS control plane to cause the xDS client to read files outside configured allowed root directories when a symbolic link inside an allowed directory points outside it. In deployments using a credential injector, header-compatible text secrets may be exposed to an attacker-observable upstream.","summary":"armeria-xds 1.40.0 through 1.42.0 checks file paths without resolving symbolic links, so a compromised or semi-trusted xDS control plane can make the client read files outside its allowed root directories. In deployments that use a credential injector, text secrets may be sent to an upstream an attacker can observe.","severity":"medium","cvss":5.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["armeria","grpc","java","package","xds"],"not_affected_if":["default-config","unaffected-version"],"how_to_check":"- Check the armeria-xds version in your dependency file (for example `build.gradle` or `pom.xml`) against the affected range `1.40.0` through `1.42.0`.\n- Check whether your service uses DataSourcePolicy with allowed root directories and a credential injector.","fix":"- armeria-xds: unknown (the sources give no fixed version)","status":"open","published_at":"2026-11-06T08:17:20+00:00","first_seen_at":"2026-11-06T08:40:33+00:00","triaged_at":"2026-11-06T08:42:38+00:00","updated_at":"2026-11-06T08:42:38+00:00","category":"package","confidence":0.7,"triage":{"at":"2026-11-06T08:42:38Z","model":"claude-haiku-5-5","output":{"fix":"- armeria-xds: unknown (the sources give no fixed version)","reach":"network","title":"armeria-xds: symlink check lets control plane read files outside allowed directories","impact":"medium","summary":"armeria-xds 1.40.0 through 1.42.0 checks file paths without resolving symbolic links, so a compromised or semi-trusted xDS control plane can make the client read files outside its allowed root directories. In deployments that use a credential injector, text secrets may be sent to an upstream an attacker can observe.","audience":"developers","category":"package","nicknames":[],"who_cares":["java","armeria","xds","grpc"],"confidence":0.7,"fix_status":"unknown","needs_auth":"yes","worst_case":"Arbitrary local files are read and text secrets may leak upstream","analyst_note":"Confirm the fixed version and whether the vendor advisory on GitHub names one; the sources here do not state a fix.","how_to_check":"- Check the armeria-xds version in your dependency file (for example `build.gradle` or `pom.xml`) against the affected range `1.40.0` through `1.42.0`.\n- Check whether your service uses DataSourcePolicy with allowed root directories and a credential injector.","plain_action":"","needs_analyst":true,"not_affected_if":["default-config","unaffected-version"],"who_is_affected":"Only services that use armeria-xds in the affected range and load configuration from an xDS control plane with DataSourcePolicy. The risk depends on the control plane being compromised or semi-trusted and on symbolic links existing inside allowed directories. Services not using the xDS client or not on the affected versions can skip it. The credential injector case adds secret exposure risk for deployments that use one.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000745,"input_tokens":4308,"output_tokens":628,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-121819':16A,19A '-2026':15A,18A '1.40.0':28B,88C '1.42.0':30B,90C 'allow':12A,56B,100C,120C,129C 'armeria':2A,20B,26B,85C 'armeria-xd':1A,25B,84C 'attack':75B,151C 'attacker-observ':150C 'caus':111C 'check':5A,31B,93C 'client':51B,114C 'compat':142C 'compromis':40B,102C 'configur':119C 'contain':95C 'control':7A,46B,108C 'credenti':64B,138C 'cve':14A,17A 'datasourcepolici':92C 'deploy':60B,135C 'directori':13A,58B,122C,130C 'expos':147C 'file':10A,32B,53B,117C 'filenam':94C 'grpc':21B 'header':141C 'header-compat':140C 'identifi':82C 'injector':65B,139C 'insid':127C 'java':22B 'let':6A 'link':37B,99C,126C 'make':49B 'may':68B,145C 'observ':77B,152C 'outsid':11A,54B,118C,132C 'packag':23B 'path':33B 'plane':8A,47B,109C 'point':131C 'read':9A,52B,116C 'resolv':35B,97C 'root':57B,121C 'secret':67B,144C 'semi':43B,105C 'semi-trust':42B,104C 'sent':70B 'symbol':36B,98C,125C 'symlink':4A 'text':66B,143C 'trust':44B,106C 'upstream':73B,153C 'use':62B,136C 'version':87C 'vulner':79C 'without':34B,96C 'xds':3A,24B,27B,45B,86C,107C,113C","nicknames":[],"mitigations":[],"who_affected":"Only services that use armeria-xds in the affected range and load configuration from an xDS control plane with DataSourcePolicy. The risk depends on the control plane being compromised or semi-trusted and on symbolic links existing inside allowed directories. Services not using the xDS client or not on the affected versions can skip it. The credential injector case adds secret exposure risk for deployments that use one.","tier":"C","verified":{},"analyst_revisit_at":null,"fix_status":"unknown","audience":"developers","plain_action":null,"pkeys":[],"ptokens":[],"labels":["armeria","grpc","java","medium","package","xds"],"campaign_type":null,"search_a":"'-121819':16A,19A '-2026':15A,18A 'allow':12A 'armeria':2A 'armeria-xd':1A 'check':5A 'control':7A 'cve':14A,17A 'directori':13A 'file':10A 'let':6A 'outsid':11A 'plane':8A 'read':9A 'symlink':4A 'xds':3A","search_b":"'1.40.0':28B '1.42.0':30B 'allow':56B 'armeria':20B,26B 'armeria-xd':25B 'attack':75B 'check':31B 'client':51B 'compromis':40B 'control':46B 'credenti':64B 'deploy':60B 'directori':58B 'file':32B,53B 'grpc':21B 'injector':65B 'java':22B 'link':37B 'make':49B 'may':68B 'observ':77B 'outsid':54B 'packag':23B 'path':33B 'plane':47B 'read':52B 'resolv':35B 'root':57B 'secret':67B 'semi':43B 'semi-trust':42B 'sent':70B 'symbol':36B 'text':66B 'trust':44B 'upstream':73B 'use':62B 'without':34B 'xds':24B,27B,45B","search_c":"'1.40.0':88C '1.42.0':90C 'allow':100C,120C,129C 'armeria':85C 'armeria-xd':84C 'attack':151C 'attacker-observ':150C 'caus':111C 'check':93C 'client':114C 'compat':142C 'compromis':102C 'configur':119C 'contain':95C 'control':108C 'credenti':138C 'datasourcepolici':92C 'deploy':135C 'directori':122C,130C 'expos':147C 'file':117C 'filenam':94C 'header':141C 'header-compat':140C 'identifi':82C 'injector':139C 'insid':127C 'link':99C,126C 'may':145C 'observ':152C 'outsid':118C,132C 'plane':109C 'point':131C 'read':116C 'resolv':97C 'root':121C 'secret':144C 'semi':105C 'semi-trust':104C 'symbol':98C,125C 'text':143C 'trust':106C 'upstream':153C 'use':136C 'version':87C 'vulner':79C 'without':96C 'xds':86C,107C,113C","first_public_at":"2026-11-06T07:18:45+00:00","kev":null,"cvss_vector":"CVSS:4.0/AV:N/AC:L/AT:P/PR:H/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X","cvss_by":"dl_cve@linecorp.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-121819","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-121819","severity":null,"published_at":"2026-11-06T08:17:20+00:00","modified_at":"2026-11-06T08:17:20+00:00","first_seen_at":"2026-11-06T08:40:33+00:00","fetched_at":"2026-11-06T08:40:33+00:00","note":null}],"documents":[{"id":84759,"url":"https://github.com/line/armeria/security/advisories/GHSA-m64h-m6r5-6jrx","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-11-06T07:18:45+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"exploit_sources":[],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}