MAL-2026-17927Malicious code in fabtoolkit (PyPI)
| Ecosystem | Package | Version |
|---|---|---|
| PyPI | fabtoolkit | 0.1.0 |
| PyPI | fabtoolkit | 0.1.1 |
| PyPI | fabtoolkit | 0.1.2 |
| PyPI | fabtoolkit | 0.2.0 |
| PyPI | fabtoolkit | 0.2.1 |
{"schema_version":"1.7.4","id":"MAL-2026-17927","published":"2026-10-19T02:26:31Z","modified":"2026-11-08T00:35:27.885691177Z","summary":"Malicious code in fabtoolkit (PyPI)","details":"\n---\n_-= Per source details. Do not edit below this line.=-_\n\n## Source: amazon-inspector (e55333b9d934a04c029943e0e6fbf34fff7c1344e0d1964b6860bc02d322855d)\nfabtoolkit executes a payload (embedded as a CHILD string run via `subprocess.run([sys.executable,'-I','-c',CHILD],...)`) that fetches a JSON config from https://transfer.archivete.am/H2Uxm/fabdeploycheck-config.json with TLS verification disabled (`ssl._create_unverified_context()`) and dispatches on config-supplied `kind` values: `file` reads arbitrary filesystem paths, `run` executes attacker-supplied argv via subprocess, `http` issues attacker-chosen requests with Bearer tokens chained from previously-read files, `tcp` probes ports, and `revsh` forks a daemon that polls `base+'/'+ident+'-cmd.txt'` and pipes the returned bytes into `/bin/sh -c`, PUTting stdout/stderr back to the same host. Collected file contents, command output, HTTP responses, and probe results are packed into an in-memory zip and PUT to transfer.archivete.am under an attacker-chosen report name. Before daemonizing, the payload walks `/proc/*/cmdline` and SIGKILLs processes whose cmdlines contain `FABDRV3`, `fabdrv2`, or `connection ready`, enforcing single-instance persistence and clearing prior variants. The entry points `python -m fabtoolkit` and any import path reaching `selftest()`/`check()` trigger the payload. The destination is an anonymous public file-transfer host; config-controlled file reads enable harvesting of credentials such as `~/.aws/credentials` and `~/.ssh/*` along with cloud metadata via the `http` kind. The package has no legitimate functionality matching its naming.\n\n## Source: kam193 (2bf19474223c7d4ca639f13835ca22395443b92a5418d226733dfe81b3a25d5e)\nPackage hides code that starts malicious actions: it downloads a C2 configuration and executes commands from it. It supports exfiltrating files, running commands, and starting a reverse shell.\n\n\n---\n\nCategory: MALICIOUS - The campaign has clearly malicious intent, like infostealers.\n\n\nCampaign: 2026-11-fabtoolkit\n\n\nReasons (based on the campaign):\n\n\n - The package contains code to execute remote commands (probably limited to a specific set) on the victim's machine.\n\n\n - exfiltration-generic\n\n\n - The package contains code to exfiltrate basic data from the system, like IP or username. It has a limited risk.\n\n\n - The package contains code to create a reverse shell, allowing an attacker to execute any commands on the victim's machine.\n","affected":[{"package":{"name":"fabtoolkit","ecosystem":"PyPI"},"versions":["0.1.2","0.1.1","0.1.0","0.2.1","0.2.0"],"database_specific":{"cwes":[{"cweId":"CWE-506","description":"The product contains code that appears to be malicious in nature.","name":"Embedded Malicious Code"},{"cweId":"CWE-506","description":"The product contains code that appears to be malicious in nature.","name":"Embedded Malicious Code"},{"cweId":"CWE-506","description":"The product contains code that appears to be malicious in nature.","name":"Embedded Malicious Code"},{"cweId":"CWE-506","description":"The product contains code that appears to be malicious in nature.","name":"Embedded Malicious Code"}],"indicators":{"evidence_files":[{"path":"fabtoolkit/__init__.py","sha256":"518954224d7879e904b0f7fa669c0f7463e7ea0269ed7f0ed50681178bfce0f5","tlsh":"09e18322981a3472d283e53cac31c9557b56be1b910398717edc9b645fc84b7c0b27ba"}],"package_integrity":[{"filename":"fabtoolkit-0.1.2-py3-none-any.whl","hashes":{"blake2b_256":"2fec5b2c219bcc8605baf68810edf70577716b20d81e4457a0229ae993b2b6ba","md5":"f6b79c593a351f3e8c9a9a88aedf0de8","sha256":"1e527bdf3345ce4e7e24091205ef6c84a06508bf5bf83c7bdec48d26b7522b2b"}}]}}}],"references":[{"type":"PACKAGE","url":"https://pypi.org/project/fabtoolkit/0.1.2/"},{"type":"PACKAGE","url":"https://pypi.org/project/fabtoolkit/0.1.1/"},{"type":"PACKAGE","url":"https://pypi.org/project/fabtoolkit/0.1.0/"},{"type":"PACKAGE","url":"https://pypi.org/project/fabtoolkit/0.2.1/"},{"type":"WEB","url":"https://bad-packages.kam193.eu/pypi/package/fabtoolkit"}],"database_specific":{"iocs":{"urls":["https://transfer.archivete.am/H2Uxm/fabdeploycheck-config.json"]},"malicious-packages-origins":[{"id":"IN-MAL-2026-021526","import_time":"2026-10-19T02:27:23.818284981Z","modified_time":"2026-10-19T02:26:57Z","sha256":"567b18257d1e8a385129705e40ad51484d1a86491c08c37d8bf192965273cb7b","source":"amazon-inspector","versions":["0.1.2"]},{"id":"IN-MAL-2026-021523","import_time":"2026-10-19T02:27:23.723807383Z","modified_time":"2026-10-19T02:26:31Z","sha256":"7d579abeba93f8d9fe48b53f95a1ba8e45fb4630f19269aca4c5a9149c4bf6cd","source":"amazon-inspector","versions":["0.1.1"]},{"id":"IN-MAL-2026-021525","import_time":"2026-10-19T02:27:23.784650522Z","modified_time":"2026-10-19T02:26:46Z","sha256":"e55333b9d934a04c029943e0e6fbf34fff7c1344e0d1964b6860bc02d322855d","source":"amazon-inspector","versions":["0.1.0"]},{"id":"IN-MAL-2026-021544","import_time":"2026-10-20T18:46:13.402094306Z","modified_time":"2026-10-20T18:45:02Z","sha256":"31bca15e3f2b0d00803862409ca9abe10985158a994449d79348675aa632d76d","source":"amazon-inspector","versions":["0.2.1"]},{"id":"pypi/2026-11-fabtoolkit/fabtoolkit","import_time":"2026-11-08T00:33:31.811952455Z","modified_time":"2026-11-07T23:30:17.440645Z","sha256":"2bf19474223c7d4ca639f13835ca22395443b92a5418d226733dfe81b3a25d5e","source":"kam193","versions":["0.1.0","0.1.1","0.1.2","0.2.0","0.2.1"]}]},"credits":[{"name":"Amazon Inspector","contact":["inspector-research@amazon.com"],"type":"FINDER"},{"name":"Kamil Mańkowski (kam193)","contact":["https://github.com/kam193","https://bad-packages.kam193.eu/"],"type":"REPORTER"}]}数据来源:OpenSSF Malicious Packages · Apache-2.0