{"id":"MAL-2026-17884","kind":"package","aliases":["MAL-2026-17884"],"related":[],"title":"Malicious code in getpubip (PyPI)","description":"---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (6d316a35a6fe335032b2c59e47627c0af28bec9688cba40585f1365cab4f4452)\ngetpubip/__init__.py runs exec() on an approximately 2KB opaque payload produced by reversing a string literal, base64-decoding it, and zlib-decompressing it (lambda __: __import__('zlib').decompress(__import__('base64').b64decode(__[::-1])); exec(_(b'...'))). The package advertises itself as a three-line helper that returns the host's public IP by calling ipify, and a clean implementation of that functionality exists in core.py; __init__.py does not re-export get_ip and its only effect on import is to execute the hidden blob. The payload is reached whenever a consumer runs `import getpubip` or `python -m getpubip`, so any installer that uses the package executes the concealed code with no further user action. The triple-layered obfuscation (string reverse, base64, zlib) and single-character identifiers are deliberately chosen to hide the executed code from reviewers; whatever the decoded bytes do runs in the installer's process on first import.\n\n## Source: kam193 (6a07d6dd387bbd88252ffdda7f8c10daf988f0622250daf20e7ec8ee0f63c6d5)\nDuring import, obfuscated code downloads and executes an infostealer. Campaign shares some similarities with the campaign 2026-10-fontcase.\n\n\n---\n\nCategory: MALICIOUS - The campaign has clearly malicious intent, like infostealers.\n\n\nCampaign: 2026-10-getpubip\n\n\nReasons (based on the campaign):\n\n\n - Downloads and executes a remote executable.\n\n\n - infostealer\n\n\n - exfiltration-browser-data\n\n\n - obfuscation","summary":null,"severity":"critical","cvss":null,"epss":null,"exploited":false,"exploited_at":null,"products":[{"name":"getpubip","fixed":[],"affected":"= 0.1.0; = 0.1.1; = 0.1.2","ecosystem":"pypi"}],"ecosystems":["pypi"],"tags":["malicious","package"],"not_affected_if":[],"how_to_check":null,"fix":null,"status":"open","published_at":"2026-10-15T10:13:20+00:00","first_seen_at":"2026-10-26T20:52:03+00:00","triaged_at":"2026-10-26T21:06:18+00:00","updated_at":"2026-10-26T21:06:18+00:00","category":"package","confidence":null,"triage":null,"analyst_status":null,"analyst_note":null,"search":"'-1':60C '-10':202C,216C '-17884':8A,11A '-2026':7A,10A '2026':201C,215C '2kb':35C '6a07d6dd387bbd88252ffdda7f8c10daf988f0622250daf20e7ec8ee0f63c6d5':184C '6d316a35a6fe335032b2c59e47627c0af28bec9688cba40585f1365cab4f4452':28C 'action':143C 'advertis':65C 'amazon':26C 'amazon-inspector':25C 'approxim':34C 'b':62C 'b64decode':59C 'base':219C 'base64':45C,58C,151C 'base64-decoding':44C 'blob':113C 'browser':232C 'byte':171C 'call':81C 'campaign':194C,200C,207C,214C,222C 'categori':204C 'charact':156C 'chosen':160C 'clean':85C 'clear':209C 'code':2A,138C,165C,188C 'conceal':137C 'consum':120C 'core.py':92C 'data':233C 'decod':46C,170C 'decompress':51C,56C 'deliber':159C 'detail':17C 'download':189C,223C 'edit':20C 'effect':105C 'exec':31C,61C 'execut':110C,135C,164C,191C,225C,228C 'exfiltr':231C 'exfiltration-browser-data':230C 'exist':90C 'export':99C 'first':180C 'fontcas':203C 'function':89C 'get':100C 'getpubip':4A,12A,123C,127C,217C 'getpubip/__init__.py':29C 'helper':72C 'hidden':112C 'hide':162C 'host':76C 'identifi':157C 'implement':86C 'import':54C,57C,107C,122C,181C,186C 'infosteal':193C,213C,229C 'init':93C 'inspector':27C 'instal':130C,176C 'intent':211C 'ip':79C,101C 'ipifi':82C 'kam193':183C 'lambda':53C 'layer':147C 'like':212C 'line':23C,71C 'liter':43C 'm':126C 'mal':6A,9A 'malici':1A,13B,205C,210C 'obfusc':148C,187C,234C 'opaqu':36C 'packag':14B,64C,134C 'payload':37C,115C 'per':15C 'process':178C 'produc':38C 'public':78C 'py':94C 'pypi':5A 'python':125C 're':98C 're-export':97C 'reach':117C 'reason':218C 'remot':227C 'return':74C 'revers':40C,150C 'review':167C 'run':30C,121C,173C 'share':195C 'similar':197C 'singl':155C 'single-charact':154C 'sourc':16C,24C,182C 'string':42C,149C 'three':70C 'three-lin':69C 'tripl':146C 'triple-lay':145C 'use':132C 'user':142C 'whatev':168C 'whenev':118C 'zlib':50C,55C,152C 'zlib-decompress':49C","nicknames":[],"mitigations":[],"who_affected":null,"tier":null,"verified":{},"analyst_revisit_at":null,"first_public_at":"2026-10-15T10:13:20+00:00","kev":null,"cvss_vector":null,"cvss_by":null,"poc_count":0,"sources":[{"source":"osv-malicious","external_id":"MAL-2026-17884","url":"https://osv.dev/vulnerability/MAL-2026-17884","severity":"critical","published_at":"2026-10-15T10:13:20+00:00","modified_at":"2026-10-26T19:00:41+00:00","first_seen_at":"2026-10-26T20:52:03+00:00","fetched_at":"2026-10-26T20:52:03+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"}