{"id":"MAL-2026-10091","kind":"package","aliases":["MAL-2026-10091"],"related":[],"title":"Malicious code in qlinforge (PyPI)","description":"---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (713a696ce725031aab16903d7a29c80611a4c4368c7e35bacf29069a3581c602)\nsetup.py registers a custom install command that, on Linux, downloads an opaque binary from http://115.190.124.243:9090/payload_linux_amd64 to /tmp/.cache, chmods it executable, and runs it with a C2 argument https://115.190.124.243:8443; on Windows it uses certutil to fetch http://115.190.124.243:9090/payload_windows_amd64.exe to C:/Windows/Temp/svchost2.exe (masquerading as svchost) and executes it. setup.py also writes a qlinforge.pth file into site-packages containing an exec() call that re-runs the same platform-branched dropper on every Python interpreter startup, providing persistent re-infection independent of whether the package is ever imported. The package is advertised as a benign 'Data Validation & Formatting Toolkit' with decoy validator/formatter/parser modules to hide the install-time payload.\n\n## Source: kam193 (8952681c2680f17702d34d053b0af1af1ff8e27a18338b3e84cad5de7e661919)\nDuring installation, the package downloads and executes suspicious executables as well as establishes persistence using PTH files.\n\n\n---\n\nCategory: MALICIOUS - The campaign has clearly malicious intent, like infostealers.\n\n\nCampaign: 2026-07-qlinforge\n\n\nReasons (based on the campaign):\n\n\n - The package overrides the install command in setup.py to execute malicious code during installation.\n\n\n - Downloads and executes a remote executable.\n\n\n - abuses-pth\n\n\n - persistence\n\n## Source: ossf-package-analysis (b7b8698feb88c0880cb05ff902f7e344c5c0a136b345f454b1ab912b3c839b74)\nThe OpenSSF Package Analysis project identified 'qlinforge' @ 0.3.2 (pypi) as malicious.\n\nIt is considered malicious because:\n\n- The package executes one or more commands associated with malicious behavior.","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"qlinforge","fixed":[],"affected":"= 0.3.2","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-07-09T16:55:58+00:00","first_seen_at":"2026-10-26T20:51:56+00:00","triaged_at":"2026-10-26T21:12:36+00:00","updated_at":"2026-10-26T21:12:36+00:00","category":"package","confidence":null,"triage":null,"analyst_status":null,"analyst_note":null,"search":"'-07':173C '-10091':8A,11A '-2026':7A,10A '/tmp/.cache':46C '/windows/temp/svchost2.exe':70C '0.3.2':217C '115.190.124.243':43C,57C,66C '2026':172C '713a696ce725031aab16903d7a29c80611a4c4368c7e35bacf29069a3581c602':28C '8443':58C '8952681c2680f17702d34d053b0af1af1ff8e27a18338b3e84cad5de7e661919':143C '9090/payload_linux_amd64':44C '9090/payload_windows_amd64.exe':67C 'abus':201C 'abuses-pth':200C 'advertis':122C 'also':78C 'amazon':26C 'amazon-inspector':25C 'analysi':208C,213C 'argument':56C 'associ':233C 'b7b8698feb88c0880cb05ff902f7e344c5c0a136b345f454b1ab912b3c839b74':209C 'base':176C 'behavior':236C 'benign':125C 'binari':41C 'branch':99C 'c':69C 'c2':55C 'call':90C 'campaign':164C,171C,179C 'categori':161C 'certutil':63C 'chmod':47C 'clear':166C 'code':2A,191C 'command':34C,185C,232C 'consid':223C 'contain':87C 'custom':32C 'data':126C 'decoy':131C 'detail':17C 'download':38C,148C,194C 'dropper':100C 'edit':20C 'establish':156C 'ever':117C 'everi':102C 'exec':89C 'execut':49C,75C,150C,152C,189C,196C,199C,228C 'fetch':65C 'file':82C,160C 'format':128C 'hide':135C 'identifi':215C 'import':118C 'independ':111C 'infect':110C 'infosteal':170C 'inspector':27C 'instal':33C,138C,145C,184C,193C 'install-tim':137C 'intent':168C 'interpret':104C 'kam193':142C 'like':169C 'line':23C 'linux':37C 'mal':6A,9A 'malici':1A,13B,162C,167C,190C,220C,224C,235C 'masquerad':71C 'modul':133C 'one':229C 'opaqu':40C 'openssf':211C 'ossf':206C 'ossf-package-analysi':205C 'overrid':182C 'packag':14B,86C,115C,120C,147C,181C,207C,212C,227C 'payload':140C 'per':15C 'persist':107C,157C,203C 'platform':98C 'platform-branch':97C 'project':214C 'provid':106C 'pth':159C,202C 'pypi':5A,218C 'python':103C 'qlinforg':4A,174C,216C 'qlinforge':12A 'qlinforge.pth':81C 're':93C,109C 're-infect':108C 're-run':92C 'reason':175C 'regist':30C 'remot':198C 'run':51C,94C 'setup.py':29C,77C,187C 'site':85C 'site-packag':84C 'sourc':16C,24C,141C,204C 'startup':105C 'suspici':151C 'svchost':73C 'time':139C 'toolkit':129C 'use':62C,158C 'valid':127C 'validator/formatter/parser':132C 'well':154C 'whether':113C 'window':60C 'write':79C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-07-09T16:55:58+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-10091","url":"https://osv.dev/vulnerability/MAL-2026-10091","severity":"critical","published_at":"2026-07-09T16:55:58+00:00","modified_at":"2026-09-01T11:30:38+00:00","first_seen_at":"2026-10-26T20:51:56+00:00","fetched_at":"2026-10-26T20:51:56+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"}