{"id":"CVE-2026-45579","kind":"vulnerability","aliases":["CVE-2026-45579","GHSA-9jpv-c7p4-997x"],"related":[],"title":"DIRAC is vulnerable to RCE in RequestManager due to eval on untrusted input","description":"### Summary\nAn remote code execution vulnerability exists in RequestManager due to the use of eval on untrusted input that allows any authenticated user to run code/commands on the DIRAC server as the system user running the DIRAC services.\n\n### Details\nThe export_getRequestCountersWeb function is callable by any authenticated user and just passes its parameters directly to the database instance:\nhttps://github.com/DIRACGrid/DIRAC/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/DIRAC/RequestManagementSystem/Service/ReqManagerHandler.py#L270\n\nIf the groupingAttribute string is unrecognised, `Request.` is prepended to it and the result is passed into an `eval()` call:\nhttps://github.com/DIRACGrid/DIRAC/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/DIRAC/RequestManagementSystem/DB/RequestDB.py#L766-L776\n\nBy passing in a dunder string that is applicable to the Request object, it's possible to work back up to functions in the os module and trigger them to be called in the server context.\n\nThere are other uses of eval in ReqManager/RequestDB which may be equally accessible.\n\n### Impact\nThis allows any authenticated user to run commands on the server, which allows a full compromise of the DIRAC system (they can read the local dirac.cfg, get database passwords and export all stored proxies and tokens). If local logging is used, they can also remove evidence of the exploit from the log (it leaves an exception printout in the RequestManager log when used).\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 RequestManager passes a user-supplied grouping attribute into a Python eval() call, so any authenticated user can reach os functions. An attacker who can log in can run commands as the account that runs the DIRAC services, then read dirac.cfg, database passwords and stored proxies and tokens.","severity":"critical","cvss":9.9,"epss":0.00864,"exploited":false,"exploited_at":null,"products":[{"name":"DIRAC","fixed":["8.0.79"],"affected":">= 6, < 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-95","dirac","grid-computing","package","python","self-hosted"],"not_affected_if":["fixed-version","no-requestmanager-service"],"how_to_check":"- Check the installed DIRAC version with `pip show DIRAC` on each DIRAC server and compare it with the fixed versions below.\n- Confirm whether the RequestManager service is reachable by any authenticated user in your deployment.","fix":"- DIRAC `8.0.79` for the 8.0 line (affected from 6 up to before 8.0.79)\n- DIRAC `9.0.22` for the 9.0 line (affected from 8.1.0a1 up to before 9.0.22)\n- DIRAC `9.1.10` for the 9.1 line (affected from 9.1.0 up to before 9.1.10)","status":"open","published_at":"2026-07-13T17:20:18+00:00","first_seen_at":"2026-11-10T19:40:05+00:00","triaged_at":"2026-11-10T20:04:57+00:00","updated_at":"2026-11-10T20:04:57+00:00","category":"package","confidence":0.85,"triage":{"at":"2026-11-10T20:04:57Z","model":"claude-haiku-5-5","output":{"fix":"- DIRAC `8.0.79` for the 8.0 line (affected from 6 up to before 8.0.79)\n- DIRAC `9.0.22` for the 9.0 line (affected from 8.1.0a1 up to before 9.0.22)\n- DIRAC `9.1.10` for the 9.1 line (affected from 9.1.0 up to before 9.1.10)","reach":"network","title":"DIRAC: authenticated users can run server commands through RequestManager eval","impact":"high","summary":"DIRAC's RequestManager passes a user-supplied grouping attribute into a Python eval() call, so any authenticated user can reach os functions. An attacker who can log in can run commands as the account that runs the DIRAC services, then read dirac.cfg, database passwords and stored proxies and tokens.","audience":"businesses","category":"package","nicknames":[],"who_cares":["dirac","python","grid-computing","self-hosted"],"confidence":0.85,"fix_status":"available","needs_auth":"yes","worst_case":"code runs as the DIRAC service user, secrets readable","analyst_note":"unknown","how_to_check":"- Check the installed DIRAC version with `pip show DIRAC` on each DIRAC server and compare it with the fixed versions below.\n- Confirm whether the RequestManager service is reachable by any authenticated user in your deployment.","plain_action":"","product_name":"","needs_analyst":false,"not_affected_if":["fixed-version","no-requestmanager-service"],"who_is_affected":"Any DIRAC server running the RequestManager service is exposed, because export_getRequestCountersWeb accepts input from any authenticated user and passes it into eval(). Deployments where only trusted staff hold accounts are still exposed to any insider or to a stolen account. Servers without the RequestManager service, or on a fixed version, are not affected.","user_interaction":"no","product_ecosystem":"","needs_special_setup":"unknown","severity_if_unknown":"critical"},"cost_usd":0.000868,"input_tokens":5301,"output_tokens":676,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-2026':15A,23A '-45579':16A,24A '-95':29B '/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/db/requestdb.py#l766-l776':173C '/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/service/reqmanagerhandler.py#l270':150C '/project/dirac/8.0.79/':291C '/project/dirac/9.0.22/':294C '/project/dirac/9.1.10/':297C '997x':21A '9jpv':19A 'access':222C 'account':73B 'allow':108C,225C,236C 'also':267C 'applic':182C 'attack':63B 'attribut':48B 'authent':56B,110C,136C,227C 'back':192C 'c7p4':20A 'call':53B,170C,205C 'callabl':133C 'code':92C 'code/commands':114C 'command':70B,231C 'compromis':239C 'comput':33B 'context':209C 'cve':14A,22A 'cwe':28B 'databas':82B,146C,251C 'detail':127C 'dirac':1A,25A,26A,27A,30B,39B,77B,117C,125C,242C 'dirac.cfg':81B,249C 'direct':143C 'due':8A,98C 'dunder':178C 'equal':221C 'eval':10A,52B,103C,169C,215C 'evid':269C 'except':279C 'execut':93C 'exist':95C 'exploit':272C 'export':129C,254C 'full':238C 'function':61B,131C,195C 'get':250C 'getrequestcountersweb':130C 'ghsa':18A 'ghsa-9jpv-c7p4-997x':17A 'github.com':149C,172C 'github.com/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/db/requestdb.py#l766-l776':171C 'github.com/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/service/reqmanagerhandler.py#l270':148C 'grid':32B 'grid-comput':31B 'group':47B 'groupingattribut':153C 'host':38B 'impact':223C 'input':13A,106C 'instanc':147C 'leav':277C 'local':248C,261C 'log':66B,262C,275C,284C 'may':219C 'modul':199C 'object':186C 'os':60B,198C 'packag':34B 'paramet':142C 'pass':42B,140C,166C,175C 'password':83B,252C 'patch':287C 'possibl':189C 'prepend':159C 'printout':280C 'proxi':86B,257C 'pypi.org':290C,293C,296C 'pypi.org/project/dirac/8.0.79/':289C 'pypi.org/project/dirac/9.0.22/':292C 'pypi.org/project/dirac/9.1.10/':295C 'python':35B,51B 'rce':5A 'reach':59B 'read':80B,246C 'remot':91C 'remov':268C 'reqmanager/requestdb':217C 'request':157C,185C 'requestmanag':7A,41B,97C,283C 'result':164C 'run':69B,75B,113C,123C,230C 'self':37B 'self-host':36B 'server':118C,208C,234C 'servic':78B,126C 'store':85B,256C 'string':154C,179C 'summari':89C 'suppli':46B 'system':121C,243C 'token':88B,259C 'trigger':201C 'unrecognis':156C 'untrust':12A,105C 'use':101C,213C,264C,286C 'user':45B,57B,111C,122C,137C,228C 'user-suppli':44B 'version':288C 'vulner':3A,94C 'work':191C","nicknames":[],"mitigations":[],"who_affected":"Any DIRAC server running the RequestManager service is exposed, because export_getRequestCountersWeb accepts input from any authenticated user and passes it into eval(). Deployments where only trusted staff hold accounts are still exposed to any insider or to a stolen account. Servers without the RequestManager service, or on a fixed version, are not affected.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"pkeys":["dirac"],"ptokens":["dirac"],"labels":["critical","cwe95","dirac","gridcomputing","package","pypi","python","selfhosted"],"campaign_type":null,"search_a":"'-2026':15A,23A '-45579':16A,24A '997x':21A '9jpv':19A 'c7p4':20A 'cve':14A,22A 'dirac':1A,25A,26A,27A 'due':8A 'eval':10A 'ghsa':18A 'ghsa-9jpv-c7p4-997x':17A 'input':13A 'rce':5A 'requestmanag':7A 'untrust':12A 'vulner':3A","search_b":"'-95':29B 'account':73B 'attack':63B 'attribut':48B 'authent':56B 'call':53B 'command':70B 'comput':33B 'cwe':28B 'databas':82B 'dirac':30B,39B,77B 'dirac.cfg':81B 'eval':52B 'function':61B 'grid':32B 'grid-comput':31B 'group':47B 'host':38B 'log':66B 'os':60B 'packag':34B 'pass':42B 'password':83B 'proxi':86B 'python':35B,51B 'reach':59B 'read':80B 'requestmanag':41B 'run':69B,75B 'self':37B 'self-host':36B 'servic':78B 'store':85B 'suppli':46B 'token':88B 'user':45B,57B 'user-suppli':44B","search_c":"'/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/db/requestdb.py#l766-l776':173C '/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/service/reqmanagerhandler.py#l270':150C '/project/dirac/8.0.79/':291C '/project/dirac/9.0.22/':294C '/project/dirac/9.1.10/':297C 'access':222C 'allow':108C,225C,236C 'also':267C 'applic':182C 'authent':110C,136C,227C 'back':192C 'call':170C,205C 'callabl':133C 'code':92C 'code/commands':114C 'command':231C 'compromis':239C 'context':209C 'databas':146C,251C 'detail':127C 'dirac':117C,125C,242C 'dirac.cfg':249C 'direct':143C 'due':98C 'dunder':178C 'equal':221C 'eval':103C,169C,215C 'evid':269C 'except':279C 'execut':93C 'exist':95C 'exploit':272C 'export':129C,254C 'full':238C 'function':131C,195C 'get':250C 'getrequestcountersweb':130C 'github.com':149C,172C 'github.com/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/db/requestdb.py#l766-l776':171C 'github.com/diracgrid/dirac/blob/f7e0a3ac153315030fb3520e8ca747f013758967/src/dirac/requestmanagementsystem/service/reqmanagerhandler.py#l270':148C 'groupingattribut':153C 'impact':223C 'input':106C 'instanc':147C 'leav':277C 'local':248C,261C 'log':262C,275C,284C 'may':219C 'modul':199C 'object':186C 'os':198C 'paramet':142C 'pass':140C,166C,175C 'password':252C 'patch':287C 'possibl':189C 'prepend':159C 'printout':280C 'proxi':257C 'pypi.org':290C,293C,296C 'pypi.org/project/dirac/8.0.79/':289C 'pypi.org/project/dirac/9.0.22/':292C 'pypi.org/project/dirac/9.1.10/':295C 'read':246C 'remot':91C 'remov':268C 'reqmanager/requestdb':217C 'request':157C,185C 'requestmanag':97C,283C 'result':164C 'run':113C,123C,230C 'server':118C,208C,234C 'servic':126C 'store':256C 'string':154C,179C 'summari':89C 'system':121C,243C 'token':259C 'trigger':201C 'unrecognis':156C 'untrust':105C 'use':101C,213C,264C,286C 'user':111C,122C,137C,228C 'version':288C 'vulner':94C 'work':191C","cause_entry":null,"cause_path":null,"disclosures_checked_at":null,"first_public_at":"2026-07-13T14:56:27+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","cvss_by":"GitHub","poc_count":0,"sources":[{"source":"ghsa","external_id":"GHSA-9jpv-c7p4-997x","url":"https://github.com/advisories/GHSA-9jpv-c7p4-997x","severity":"critical","published_at":"2026-07-13T17:20:18+00:00","modified_at":"2026-11-10T19:39:41+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-45579","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-45579","severity":null,"published_at":"2026-09-15T18:17:21+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":117603,"url":"https://api.github.com/repos/DIRACGrid/DIRAC/security-advisories/GHSA-9jpv-c7p4-997x","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":117604,"url":"https://github.com/DIRACGrid/DIRAC/security/advisories/GHSA-9jpv-c7p4-997x","title":"Maintainer's advisory: github.com","kind":"vendor","source":"ghsa","publisher":"vendor","text":null,"published_at":"2026-07-13T14:56:27+00:00","relation":"advisory","confidence":null,"note":"Maintainer's advisory: github.com"},{"id":117605,"url":"https://github.com/DIRACGrid/DIRAC/commit/8ec11072f48103d94e8b7cca831e2c7ce304d6c7","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117606,"url":"https://github.com/DIRACGrid/DIRAC/commit/99f1af88b525e69a77f204aebf7d8df3b6056142","title":"Patch: github.com","kind":"other","source":"ghsa","publisher":"vendor","text":null,"published_at":null,"relation":"fix","confidence":null,"note":"Patch: github.com"},{"id":117607,"url":"https://github.com/DIRACGrid/DIRAC/commit/a6f75ce5d369254d46ca6f1d39e3f384366fa396","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.00864,"url":"https://api.first.org/data/v1/epss?cve=CVE-2026-45579"}],"notice":"Free to read, with fair use of about 60 pages a minute. For higher limits or API access: sales@infrastack.ai"}