{"id":"CVE-2026-95628","kind":"vulnerability","aliases":["CVE-2026-95628"],"related":[],"title":"Apache Camel Docling: absolute paths escape the working directory","description":"Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal') vulnerability in Apache Camel Docling component.\n\n\n\nThis issue affects Apache Camel: from 4.15.0 before 4.18.5, from 4.19.0 before 4.22.2.\n\n\n\nDoclingProducer builds the command line of the external docling tool and appends to it the custom arguments supplied in the CamelDoclingCustomArguments header, a list of strings whose flags the fix for CVE-2026-40047 restricted to an allowlist. That fix also introduced validatePathSafety to keep path-like argument values inside the intended directory, but the method only looked for relative traversal: it rejected a value containing a traversal sequence such as ../ and a value whose normalized form still held a .. element. It never checked whether a value was an absolute path, and an absolute path without traversal segments contains neither, so it passed unchanged. Every path-like value went through this check, whether it was a separate list element following its flag or was attached to the flag after an equals sign, so an absolute path was accepted in either form, for example as the directory given to the allowlisted --artifacts-path flag, which tells docling where to find its model artifacts. Such a value reached the docling command line as given, so a party able to choose the custom arguments could point the docling process at any directory the Camel process can access, outside the working directory that the check was meant to keep path values in, which is the outcome the CVE-2026-40047 fix set out to prevent. Only the CLI mode, which is the default, passes custom arguments to docling. The header belongs to the Camel header namespace, which consumers applying Camel's default header filtering, such as the JMS and Kafka consumers, remove from incoming messages, so the issue is reached where a route forwards externally influenced values into the header or where a consumer maps incoming headers without that filtering.\n\n\n\nUsers are recommended to upgrade to version 4.23.0, which fixes the issue. If users are on the 4.22.x releases stream, then they are suggested to upgrade to 4.22.2. If users are on the 4.18.x releases stream, then they are suggested to upgrade to 4.18.5. The 4.15.x to 4.17.x and 4.19.x to 4.21.x release lines reached end of life before this issue was resolved and will not receive a fix, so deployments on them must move to a supported release. For deployments that cannot upgrade immediately, do not build the CamelDoclingCustomArguments header from values that originate outside the deployment, remove that header from messages that arrive from outside before they reach a docling endpoint, and make sure that consumers which map incoming message headers drop the Camel header namespace, so that only the route itself chooses the custom arguments.","summary":"The Camel Docling component's path check rejects relative traversal but accepts absolute paths in custom docling arguments, such as the --artifacts-path value. A party who can set the CamelDoclingCustomArguments header can point the docling process at any directory the Camel process can read.","severity":"medium","cvss":5.4,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["apache-camel","document-processing","java","jms","kafka","package"],"not_affected_if":["default-header-filtering","internal-header-values-only","no-docling-component"],"how_to_check":"- Look for the Apache Camel Docling component in the project's dependencies, for example `camel-docling` in the Maven or Gradle build, and note its version.\n- Search routes for the header `CamelDoclingCustomArguments` and check whether any value comes from an inbound message, an external API, or a Kafka or JMS consumer that does not drop the Camel header namespace.","fix":"- Upgrade Apache Camel to `4.23.0`.\n- If on the 4.22.x stream, upgrade to `4.22.2`; if on the 4.18.x stream, upgrade to `4.18.5`.\n- Releases 4.15.x to 4.17.x and 4.19.x to 4.21.x are end of life and get no fix, so move to a supported release.\n- Until upgrading, stop building CamelDoclingCustomArguments from external values and strip that header from inbound messages before they reach a docling endpoint.","status":"open","published_at":"2026-10-26T09:16:36+00:00","first_seen_at":"2026-10-26T09:29:16+00:00","triaged_at":"2026-10-26T09:31:01+00:00","updated_at":"2026-10-26T09:31:01+00:00","category":"package","confidence":0.6,"triage":{"at":"2026-10-26T09:31:01Z","model":"claude-haiku-5-5","output":{"fix":"- Upgrade Apache Camel to `4.23.0`.\n- If on the 4.22.x stream, upgrade to `4.22.2`; if on the 4.18.x stream, upgrade to `4.18.5`.\n- Releases 4.15.x to 4.17.x and 4.19.x to 4.21.x are end of life and get no fix, so move to a supported release.\n- Until upgrading, stop building CamelDoclingCustomArguments from external values and strip that header from inbound messages before they reach a docling endpoint.","reach":"unknown","title":"Apache Camel Docling: absolute paths escape the working directory","impact":"medium","summary":"The Camel Docling component's path check rejects relative traversal but accepts absolute paths in custom docling arguments, such as the --artifacts-path value. A party who can set the CamelDoclingCustomArguments header can point the docling process at any directory the Camel process can read.","category":"package","nicknames":[],"who_cares":["apache-camel","java","kafka","jms","document-processing"],"confidence":0.6,"needs_auth":"unknown","worst_case":"Attacker reads arbitrary directories on the Camel host via docling","analyst_note":"Check the NVD entry and the Apache Camel security advisory for the exact impact on file reads and whether any exploit detail exists beyond the description.","how_to_check":"- Look for the Apache Camel Docling component in the project's dependencies, for example `camel-docling` in the Maven or Gradle build, and note its version.\n- Search routes for the header `CamelDoclingCustomArguments` and check whether any value comes from an inbound message, an external API, or a Kafka or JMS consumer that does not drop the Camel header namespace.","needs_analyst":true,"not_affected_if":["no-docling-component","internal-header-values-only","default-header-filtering"],"who_is_affected":"Applications that use the Apache Camel Docling component in CLI mode, which is the default, and that let outside parties influence the CamelDoclingCustomArguments header. Exposure comes from routes that forward external values into that header, or from consumers that map incoming headers without Camel's default header filtering, such as JMS and Kafka consumers that do not remove the Camel header namespace. Teams that do not use the Docling component, or that only build the header from internal values, can skip it.","user_interaction":"no","needs_special_setup":"yes","severity_if_unknown":"medium"},"cost_usd":0.000826,"input_tokens":4110,"output_tokens":829,"severity_before":"medium"},"analyst_status":null,"analyst_note":null,"search":"'-2026':11A,14A,134C,319C '-40047':135C,320C '-95628':12A,15A '4.15':438C '4.15.0':95C '4.17':441C '4.18':425C '4.18.5':97C,436C '4.19':444C '4.19.0':99C '4.21':447C '4.22':408C '4.22.2':101C,419C '4.23.0':398C 'abl':280C 'absolut':4A,38B,192C,196C,238C 'accept':37B,241C 'access':298C 'affect':91C 'allowlist':139C,253C 'also':142C 'apach':1A,17B,85C,92C 'apache-camel':16B 'append':113C 'appli':349C 'argument':43B,118C,150C,285C,336C,534C 'arriv':501C 'artifact':48B,255C,266C 'artifacts-path':47B,254C 'attach':228C 'belong':341C 'build':103C,484C 'camel':2A,18B,27B,68B,86C,93C,295C,344C,350C,522C 'cameldoclingcustomargu':57B,122C,486C 'cannot':479C 'check':32B,186C,215C,305C 'choos':282C,531C 'cli':328C 'command':105C,273C 'compon':29B,88C 'consum':348C,361C,384C,514C 'contain':168C,201C 'could':286C 'custom':41B,117C,284C,335C,533C 'cve':10A,13A,133C,318C 'default':333C,352C 'deploy':467C,477C,494C 'directori':9A,66B,80C,155C,249C,293C,302C 'docl':3A,28B,42B,62B,87C,110C,260C,272C,289C,338C,508C 'doclingproduc':102C 'document':20B 'document-process':19B 'drop':520C 'either':243C 'element':183C,222C 'end':452C 'endpoint':509C 'equal':234C 'escap':6A 'everi':207C 'exampl':246C 'extern':109C,375C 'filter':354C,390C 'find':263C 'fix':131C,141C,321C,400C,465C 'flag':129C,225C,231C,257C 'follow':223C 'form':179C,244C 'forward':374C 'given':250C,276C 'header':58B,123C,340C,345C,353C,380C,387C,487C,497C,519C,523C 'held':181C 'immedi':481C 'improp':72C 'incom':364C,386C,517C 'influenc':376C 'insid':152C 'intend':154C 'introduc':143C 'issu':90C,368C,402C,457C 'java':22B 'jms':23B,358C 'kafka':24B,360C 'keep':146C,309C 'life':454C 'like':149C,210C 'limit':73C 'line':106C,274C,450C 'list':125C,221C 'look':160C 'make':511C 'map':385C,516C 'meant':307C 'messag':365C,499C,518C 'method':158C 'mode':329C 'model':265C 'move':471C 'must':470C 'namespac':346C,524C 'neither':202C 'never':185C 'normal':178C 'origin':491C 'outcom':316C 'outsid':299C,492C,503C 'packag':25B 'parti':52B,279C 'pass':205C,334C 'path':5A,31B,39B,49B,81C,148C,193C,197C,209C,239C,256C,310C 'path-lik':147C,208C 'pathnam':76C 'point':60B,287C 'prevent':325C 'process':21B,63B,69B,290C,296C 'reach':270C,370C,451C,506C 'read':71B 'receiv':463C 'recommend':393C 'reject':33B,165C 'relat':34B,162C 'releas':410C,427C,449C,475C 'remov':362C,495C 'resolv':459C 'restrict':79C,136C 'rout':373C,529C 'segment':200C 'separ':220C 'sequenc':171C 'set':55B,322C 'sign':235C 'still':180C 'stream':411C,428C 'string':127C 'suggest':415C,432C 'suppli':119C 'support':474C 'sure':512C 'tell':259C 'tool':111C 'travers':35B,82C,163C,170C,199C 'unchang':206C 'upgrad':395C,417C,434C,480C 'user':391C,404C,421C 'validatepathsafeti':144C 'valu':50B,151C,167C,176C,189C,211C,269C,311C,377C,489C 'version':397C 'vulner':83C 'went':212C 'whether':187C,216C 'whose':128C,177C 'without':198C,388C 'work':8A,301C 'x':409C,426C,439C,442C,445C,448C","nicknames":[],"mitigations":[],"who_affected":"Applications that use the Apache Camel Docling component in CLI mode, which is the default, and that let outside parties influence the CamelDoclingCustomArguments header. Exposure comes from routes that forward external values into that header, or from consumers that map incoming headers without Camel's default header filtering, such as JMS and Kafka consumers that do not remove the Camel header namespace. Teams that do not use the Docling component, or that only build the header from internal values, can skip it.","tier":"C","verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-26T09:16:36+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:L","cvss_by":"security@apache.org","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-95628","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-95628","severity":null,"published_at":"2026-10-26T09:16:36+00:00","modified_at":"2026-10-26T09:16:36+00:00","first_seen_at":"2026-10-26T09:29:16+00:00","fetched_at":"2026-10-26T09:29:16+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"}