{"id":"CVE-2026-104203","kind":"vulnerability","aliases":["CVE-2026-104203"],"related":[],"title":"Traccar: unauthenticated request reads protected device media files","description":"Traccar is an open source GPS tracking system. From 5.1 until 6.15.0, WebModule.java's MediaFilter Guice mapping and WebServer.java's Jetty ResourceServlet assign different routing meanings to path parameters at /api/media/*. An unauthenticated attacker who knows or guesses a device unique ID and media filename can insert a semicolon at the Servlet boundary, bypass MediaFilter's session and device authorization checks, and retrieve the protected media because Jetty still dispatches the noncanonical path to ResourceServlet. The demonstrated impact is read-only disclosure of a protected device media file; depending on the deployment and stored media, this could expose photographs, audio, video, or other uploaded files. The advisory does not establish directory listing, traversal, modification, account takeover, denial of service, or code execution. Reverse proxies that reject or rewrite semicolon path parameters may block the request. This issue is fixed in version 6.15.0.","summary":"Traccar GPS tracking server versions 5.1 through 6.14.x let an unauthenticated attacker bypass media access checks by inserting a semicolon into the /api/media path. The attacker can then download protected uploaded media such as photos, audio or video if they know or guess a device unique ID and media filename.","severity":"high","cvss":7.5,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["gps-tracking","java","package","self-hosted","traccar"],"not_affected_if":["managed-hosting","no-media-uploads","proxy-blocks-semicolons"],"how_to_check":"- Check the running Traccar version and confirm whether it is between `5.1` and `6.14.x`.\n- Look for `/api/media/` routes reachable from the internet, and check whether a reverse proxy blocks or rewrites semicolon path parameters.","fix":"- Traccar: upgrade to `6.15.0`.","status":"open","published_at":"2026-11-04T21:17:42+00:00","first_seen_at":"2026-11-04T21:49:17+00:00","triaged_at":"2026-11-04T21:50:54+00:00","updated_at":"2026-11-04T21:50:54+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-04T21:50:54Z","model":"claude-haiku-5-5","output":{"fix":"- Traccar: upgrade to `6.15.0`.","reach":"internet","title":"Traccar: unauthenticated request reads protected device media files","impact":"medium","summary":"Traccar GPS tracking server versions 5.1 through 6.14.x let an unauthenticated attacker bypass media access checks by inserting a semicolon into the /api/media path. The attacker can then download protected uploaded media such as photos, audio or video if they know or guess a device unique ID and media filename.","audience":"businesses","category":"package","nicknames":[],"who_cares":["traccar","self-hosted","gps-tracking","java"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"unauthenticated attacker downloads protected device media files","analyst_note":"","how_to_check":"- Check the running Traccar version and confirm whether it is between `5.1` and `6.14.x`.\n- Look for `/api/media/` routes reachable from the internet, and check whether a reverse proxy blocks or rewrites semicolon path parameters.","plain_action":"","needs_analyst":false,"not_affected_if":["managed-hosting","no-media-uploads","proxy-blocks-semicolons"],"who_is_affected":"Teams running self-hosted Traccar from 5.1 through 6.14.x where media uploads are stored and the /api/media endpoint is reachable from the network. Deployments behind a reverse proxy that rejects or rewrites semicolon path parameters may be blocked, and managed hosting handled by a vendor is outside the team's control.","user_interaction":"no","needs_special_setup":"unknown","severity_if_unknown":"high"},"cost_usd":0.000724,"input_tokens":4368,"output_tokens":575,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-104203':11A,14A '-2026':10A,13A '/api/media':47B,105C '5.1':29B,84C '6.14':31B '6.15.0':86C,217C 'access':39B 'account':190C 'advisori':182C 'assign':97C 'attack':36B,50B,108C 'audio':60B,175C 'author':134C 'block':208C 'boundari':127C 'bypass':37B,128C 'check':40B,135C 'code':196C 'could':172C 'cve':9A,12A 'demonstr':151C 'denial':192C 'depend':164C 'deploy':167C 'devic':6A,69B,114C,133C,161C 'differ':98C 'directori':186C 'disclosur':157C 'dispatch':144C 'download':53B 'establish':185C 'execut':197C 'expos':173C 'file':8A,163C,180C 'filenam':74B,119C 'fix':214C 'gps':16B,25B,80C 'gps-track':15B 'guess':67B,112C 'guic':90C 'host':22B 'id':71B,116C 'impact':152C 'insert':42B,121C 'issu':212C 'java':18B 'jetti':95C,142C 'know':65B,110C 'let':33B 'list':187C 'map':91C 'may':207C 'mean':100C 'media':7A,38B,56B,73B,118C,140C,162C,170C 'mediafilt':89C,129C 'modif':189C 'noncanon':146C 'open':78C 'packag':19B 'paramet':103C,206C 'path':48B,102C,147C,205C 'photo':59B 'photograph':174C 'protect':5A,54B,139C,160C 'proxi':199C 'read':4A,155C 'read-on':154C 'reject':201C 'request':3A,210C 'resourceservlet':96C,149C 'retriev':137C 'revers':198C 'rewrit':203C 'rout':99C 'self':21B 'self-host':20B 'semicolon':44B,123C,204C 'server':27B 'servic':194C 'servlet':126C 'session':131C 'sourc':79C 'still':143C 'store':169C 'system':82C 'takeov':191C 'traccar':1A,23B,24B,75C 'track':17B,26B,81C 'travers':188C 'unauthent':2A,35B,107C 'uniqu':70B,115C 'upload':55B,179C 'version':28B,216C 'video':62B,176C 'webmodule.java':87C 'webserver.java':93C 'x':32B","nicknames":[],"mitigations":[],"who_affected":"Teams running self-hosted Traccar from 5.1 through 6.14.x where media uploads are stored and the /api/media endpoint is reachable from the network. Deployments behind a reverse proxy that rejects or rewrites semicolon path parameters may be blocked, and managed hosting handled by a vendor is outside the team's control.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":[],"ptokens":[],"labels":["gpstracking","high","java","package","selfhosted","traccar"],"campaign_type":null,"first_public_at":"2026-10-17T05:29:12+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N","cvss_by":"security-advisories@github.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-104203","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-104203","severity":null,"published_at":"2026-11-04T21:17:42+00:00","modified_at":"2026-11-04T21:17:42+00:00","first_seen_at":"2026-11-04T21:49:17+00:00","fetched_at":"2026-11-04T21:49:17+00:00","note":null}],"documents":[{"id":70622,"url":"https://github.com/traccar/traccar/commit/f6f22ea32a7c6d51f2cdc923cca6d3b2621a205a","title":"Patch: github.com","kind":"other","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":70623,"url":"https://github.com/traccar/traccar/releases/tag/v6.15.0","title":"Release notes: github.com","kind":"release","source":"nvd","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release notes: github.com"},{"id":70624,"url":"https://github.com/traccar/traccar/security/advisories/GHSA-w59q-j9pg-pw7x","title":"Vendor advisory: github.com","kind":"vendor","source":"nvd","publisher":"vendor","text":null,"published_at":"2026-10-17T05:29:12+00:00","relation":"advisory","confidence":null,"note":"Vendor advisory: github.com"}],"exploit_sources":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}