{"id":"CVE-2026-61668","kind":"vulnerability","aliases":["CVE-2026-61668","GHSA-vg99-gr89-qhw9"],"related":[],"title":"DIRAC: Pilot code downloaded over unverified HTTPS connection","description":"### Summary\nThe second stage pilot (pilot.tar) is downloaded by the initial wrapper script without any verification of the webservers' SSL certificate and the contained script is subsequently executed. The checksum is tested, but the reference checksum file is downloaded over the same unvalidated channel.\n\n### Details\nThe pilot wrapper downloads and executes the main second stage pilot script, but the SSL validation on this connection is explicitly disabled (to match old python < 2.7.9 behaviour):\nhttps://github.com/DIRACGrid/DIRAC/blob/integration/src/DIRAC/WorkloadManagementSystem/Utilities/PilotWrapper.py#L292-L296\n\nThis means that the second stage pilot code is not verified in any way and could potentially be altered by a man-in-the-middle attack to execute arbitrary code in the pilot context (i.e. with access to the pilot proxy/credentials).\n\nThe HTTPS connection should be validated against both the system certificates and $X509_CERT_DIR and fail if neither validate correctly.\n\n### Impact\nThis would require a man-in-the-middle style attack against a grid site's network (i.e. changing the DNS or routing to redirect the pilot's connection); this is likely to be difficult which probably limits the potential impact.\n\n### Patched versions:\nhttps://pypi.org/project/DIRAC/8.0.79/\nhttps://pypi.org/project/DIRAC/9.0.22/\nhttps://pypi.org/project/DIRAC/9.1.10/","summary":"DIRAC's pilot wrapper downloads its second-stage pilot script over HTTPS with certificate validation turned off, and the checksum file comes over the same unverified channel. A network attacker who can redirect that connection can swap in a script that runs with the pilot's proxy and credentials.","severity":"high","cvss":8.1,"epss":0.00396,"exploited":false,"exploited_at":null,"products":[{"name":"DIRAC","fixed":["8.0.79"],"affected":">= 6.20.1, < 8.0.79","ecosystem":"pypi"},{"name":"DIRAC","fixed":["9.0.22"],"affected":">= 8.1.0a1, < 9.0.22","ecosystem":"pypi"},{"name":"DIRAC","fixed":["9.1.10"],"affected":">= 9.1.0, < 9.1.10","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["cwe-295","dirac","grid-computing","package","pilot-jobs","python"],"not_affected_if":["isolated-network","no-dirac-pilots"],"how_to_check":"- Check the installed DIRAC version with `pip show DIRAC`\n- Confirm whether the pilot wrapper (PilotWrapper.py) disables SSL validation in your deployed copy","fix":"- DIRAC `8.0.79` for the 8.0 line (affected >= 6.20.1, < 8.0.79)\n- DIRAC `9.0.22` for the 9.0 line (affected >= 8.1.0a1, < 9.0.22)\n- DIRAC `9.1.10` for the 9.1 line (affected >= 9.1.0, < 9.1.10)","status":"open","published_at":"2026-07-13T18:37:51+00:00","first_seen_at":"2026-11-10T19:40:05+00:00","triaged_at":"2026-11-10T20:05:01+00:00","updated_at":"2026-11-10T20:05:01+00:00","category":"package","confidence":0.8,"triage":{"at":"2026-11-10T20:05:01Z","model":"claude-haiku-5-5","output":{"fix":"- DIRAC `8.0.79` for the 8.0 line (affected >= 6.20.1, < 8.0.79)\n- DIRAC `9.0.22` for the 9.0 line (affected >= 8.1.0a1, < 9.0.22)\n- DIRAC `9.1.10` for the 9.1 line (affected >= 9.1.0, < 9.1.10)","reach":"network","title":"DIRAC: pilot code fetched without certificate checks, open to tampering","impact":"high","summary":"DIRAC's pilot wrapper downloads its second-stage pilot script over HTTPS with certificate validation turned off, and the checksum file comes over the same unverified channel. A network attacker who can redirect that connection can swap in a script that runs with the pilot's proxy and credentials.","audience":"developers","category":"package","nicknames":[],"who_cares":["dirac","grid-computing","pilot-jobs","python"],"confidence":0.8,"fix_status":"available","needs_auth":"no","worst_case":"attacker runs arbitrary code in pilot context with its credentials","analyst_note":"","how_to_check":"- Check the installed DIRAC version with `pip show DIRAC`\n- Confirm whether the pilot wrapper (PilotWrapper.py) disables SSL validation in your deployed copy\n- unknown whether the sources give further checks","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["no-dirac-pilots","isolated-network"],"who_is_affected":"Grid sites and teams that run DIRAC pilots fetch the second-stage pilot from a web server during job setup. Exposure depends on whether an attacker can intercept or redirect that network path, such as through DNS or routing changes at a grid site. Teams that do not run DIRAC pilots can skip it.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"unknown","severity_if_unknown":"unknown"},"cost_usd":0.00086,"input_tokens":5196,"output_tokens":680,"severity_before":"high"},"analyst_status":null,"analyst_note":null,"search":"'-2026':10A,18A '-295':24B '-61668':11A,19A '/diracgrid/dirac/blob/integration/src/dirac/workloadmanagementsystem/utilities/pilotwrapper.py#l292-l296':159C '/project/dirac/8.0.79/':269C '/project/dirac/9.0.22/':272C '/project/dirac/9.1.10/':275C '2.7.9':155C 'access':197C 'alter':178C 'arbitrari':189C 'attack':64B,186C,234C 'behaviour':156C 'cert':215C 'certif':48B,104C,212C 'chang':242C 'channel':61B,127C 'checksum':54B,113C,119C 'code':3A,167C,190C 'come':56B 'comput':28B 'connect':8A,69B,147C,204C,252C 'contain':107C 'context':194C 'correct':222C 'could':175C 'credenti':83B 'cve':9A,17A 'cwe':23B 'detail':128C 'difficult':258C 'dir':216C 'dirac':1A,20A,21A,22A,25B,34B 'disabl':150C 'dns':244C 'download':4A,38B,91C,122C,132C 'execut':111C,134C,188C 'explicit':149C 'fail':218C 'file':55B,120C 'ghsa':13A 'ghsa-vg99-gr89-qhw9':12A 'github.com':158C 'github.com/diracgrid/dirac/blob/integration/src/dirac/workloadmanagementsystem/utilities/pilotwrapper.py#l292-l296':157C 'gr89':15A 'grid':27B,237C 'grid-comput':26B 'https':7A,46B,203C 'i.e':195C,241C 'impact':223C,264C 'initi':94C 'job':32B 'like':255C 'limit':261C 'main':136C 'man':182C,229C 'man-in-the-middl':181C,228C 'match':152C 'mean':161C 'middl':185C,232C 'neither':220C 'network':63B,240C 'old':153C 'packag':29B 'patch':265C 'pilot':2A,31B,36B,43B,79B,88C,130C,139C,166C,193C,200C,250C 'pilot-job':30B 'pilot.tar':89C 'potenti':176C,263C 'probabl':260C 'proxi':81B 'proxy/credentials':201C 'pypi.org':268C,271C,274C 'pypi.org/project/dirac/8.0.79/':267C 'pypi.org/project/dirac/9.0.22/':270C 'pypi.org/project/dirac/9.1.10/':273C 'python':33B,154C 'qhw9':16A 'redirect':67B,248C 'refer':118C 'requir':226C 'rout':246C 'run':76B 'script':44B,74B,96C,108C,140C 'second':41B,86C,137C,164C 'second-stag':40B 'site':238C 'ssl':103C,143C 'stage':42B,87C,138C,165C 'style':233C 'subsequ':110C 'summari':84C 'swap':71B 'system':211C 'test':115C 'turn':50B 'unvalid':126C 'unverifi':6A,60B 'valid':49B,144C,207C,221C 'verif':99C 'verifi':170C 'version':266C 'vg99':14A 'way':173C 'webserv':102C 'without':97C 'would':225C 'wrapper':37B,95C,131C 'x509':214C","nicknames":[],"mitigations":[],"who_affected":"Grid sites and teams that run DIRAC pilots fetch the second-stage pilot from a web server during job setup. Exposure depends on whether an attacker can intercept or redirect that network path, such as through DNS or routing changes at a grid site. Teams that do not run DIRAC pilots can skip it.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"developers","plain_action":null,"pkeys":["dirac"],"ptokens":["dirac"],"labels":["cwe295","dirac","gridcomputing","high","package","pilotjobs","pypi","python"],"campaign_type":null,"search_a":"'-2026':10A,18A '-61668':11A,19A 'code':3A 'connect':8A 'cve':9A,17A 'dirac':1A,20A,21A,22A 'download':4A 'ghsa':13A 'ghsa-vg99-gr89-qhw9':12A 'gr89':15A 'https':7A 'pilot':2A 'qhw9':16A 'unverifi':6A 'vg99':14A","search_b":"'-295':24B 'attack':64B 'certif':48B 'channel':61B 'checksum':54B 'come':56B 'comput':28B 'connect':69B 'credenti':83B 'cwe':23B 'dirac':25B,34B 'download':38B 'file':55B 'grid':27B 'grid-comput':26B 'https':46B 'job':32B 'network':63B 'packag':29B 'pilot':31B,36B,43B,79B 'pilot-job':30B 'proxi':81B 'python':33B 'redirect':67B 'run':76B 'script':44B,74B 'second':41B 'second-stag':40B 'stage':42B 'swap':71B 'turn':50B 'unverifi':60B 'valid':49B 'wrapper':37B","search_c":"'/diracgrid/dirac/blob/integration/src/dirac/workloadmanagementsystem/utilities/pilotwrapper.py#l292-l296':159C '/project/dirac/8.0.79/':269C '/project/dirac/9.0.22/':272C '/project/dirac/9.1.10/':275C '2.7.9':155C 'access':197C 'alter':178C 'arbitrari':189C 'attack':186C,234C 'behaviour':156C 'cert':215C 'certif':104C,212C 'chang':242C 'channel':127C 'checksum':113C,119C 'code':167C,190C 'connect':147C,204C,252C 'contain':107C 'context':194C 'correct':222C 'could':175C 'detail':128C 'difficult':258C 'dir':216C 'disabl':150C 'dns':244C 'download':91C,122C,132C 'execut':111C,134C,188C 'explicit':149C 'fail':218C 'file':120C 'github.com':158C 'github.com/diracgrid/dirac/blob/integration/src/dirac/workloadmanagementsystem/utilities/pilotwrapper.py#l292-l296':157C 'grid':237C 'https':203C 'i.e':195C,241C 'impact':223C,264C 'initi':94C 'like':255C 'limit':261C 'main':136C 'man':182C,229C 'man-in-the-middl':181C,228C 'match':152C 'mean':161C 'middl':185C,232C 'neither':220C 'network':240C 'old':153C 'patch':265C 'pilot':88C,130C,139C,166C,193C,200C,250C 'pilot.tar':89C 'potenti':176C,263C 'probabl':260C 'proxy/credentials':201C 'pypi.org':268C,271C,274C 'pypi.org/project/dirac/8.0.79/':267C 'pypi.org/project/dirac/9.0.22/':270C 'pypi.org/project/dirac/9.1.10/':273C 'python':154C 'redirect':248C 'refer':118C 'requir':226C 'rout':246C 'script':96C,108C,140C 'second':86C,137C,164C 'site':238C 'ssl':103C,143C 'stage':87C,138C,165C 'style':233C 'subsequ':110C 'summari':84C 'system':211C 'test':115C 'unvalid':126C 'valid':144C,207C,221C 'verif':99C 'verifi':170C 'version':266C 'way':173C 'webserv':102C 'without':97C 'would':225C 'wrapper':95C,131C 'x509':214C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-07-13T14:55:40+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-vg99-gr89-qhw9","url":"https://github.com/advisories/GHSA-vg99-gr89-qhw9","severity":"high","published_at":"2026-07-13T18:37:51+00:00","modified_at":"2026-11-10T19:37:06+00:00","first_seen_at":"2026-11-10T19:40:05+00:00","fetched_at":"2026-11-10T20:56:29+00:00","note":null},{"source":"nvd","external_id":"CVE-2026-61668","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-61668","severity":null,"published_at":"2026-09-15T18:17:27+00:00","modified_at":"2026-09-30T17:51:56+00:00","first_seen_at":"2026-11-10T20:15:32+00:00","fetched_at":"2026-11-10T20:15:32+00:00","note":null}],"documents":[{"id":117636,"url":"https://api.github.com/repos/DIRACGrid/DIRAC/security-advisories/GHSA-vg99-gr89-qhw9","title":"Maintainer's advisory: api.github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"advisory","confidence":null,"note":"Maintainer's advisory: api.github.com"},{"id":117637,"url":"https://github.com/DIRACGrid/DIRAC/security/advisories/GHSA-vg99-gr89-qhw9","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":"2026-07-13T14:55:40+00:00","relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"},{"id":117638,"url":"https://github.com/DIRACGrid/DIRAC/commit/68029dfb5ddd8b1e4106851f8e37370aa80ac7ae","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117639,"url":"https://github.com/DIRACGrid/DIRAC/commit/92e2e26c63b964b8499bee5e9c2e2821a36eac56","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117640,"url":"https://github.com/DIRACGrid/DIRAC/commit/b332c437d064f66ee46f5b45a90a9f7c4bace38d","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117608,"url":"https://github.com/DIRACGrid/DIRAC/releases/tag/v8.0.79","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"},{"id":117609,"url":"https://github.com/DIRACGrid/DIRAC/releases/tag/v9.0.22","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"},{"id":117610,"url":"https://github.com/DIRACGrid/DIRAC/releases/tag/v9.1.10","title":"Release: github.com","kind":"release","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Release: github.com"}],"disclosures":[],"exploit_sources":[{"type":"epss","score":0.00396,"url":"https://api.first.org/data/v1/epss?cve=CVE-2026-61668"}],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}