phone-homeCovers 0.1.0a2Reviewed by BitbisonUpdated 2026-11-06
setup.py overrides the install command to POST the machine's hostname, local IP address and the package version to a webhook.site address, then installs normally; nothing else is read or sent.
On November 5, 2026, two releases of dbt-adapter were published to PyPI six minutes apart. The name is one letter short of dbt-adapters, the adapter library of the dbt project, and this package has nothing to do with it. 0.1.0a2 describes itself as a "POC package (beacon-only)". Its setup.py replaces setuptools' install command with one that posts the machine's hostname and IP address to a webhook.site address before installing. That address belongs to whoever created it. OSV lists the project as MAL-2026-18704 and files it as a probable penetration-test package. PyPI has since quarantined the project.
What the package does
Installing dbt-adapter 0.1.0a2 from its source distribution (sha256 b8b9be9ded8afbc3dfdd8bb8e58b489ef1e305bfbf377b3e68f0ed62f9f5b0d1) does this:
- When pip turns the source distribution into a wheel, its PEP 517 hook (
build_wheel) runs setup.py. The package's install command then sends one HTTPS POST to webhook.site, a public service that collects requests.
- The POST is JSON with four fields: the machine's hostname, the address that hostname resolves to locally, and the package's name and version. webhook.site also sees the public address the request comes from.
- After the POST, or if the POST fails within 3 seconds, the install goes on as normal.
The package ships no adapter code and declares no dependencies. It does not read files, environment variables or credentials. It does not take commands from the server, start other processes, or leave anything behind that runs later.
What the code does
The source distribution's three packaging files are short, and they say all of this.
setup.py (sha256 67e203d1370bb52004f54675ab77758ed2e8bf1bfdb8d3342888e1c932809b88, 38 lines):
- Line 7 sets
BEACON_URL to an HTTPS address on webhook.site, a per-owner token path.
- Lines 9–10 and 37 define
InstallWithBeacon, a subclass of setuptools' install, and register it with cmdclass={'install': InstallWithBeacon}. Its run() executes whenever setuptools runs the install command. setuptools also runs that command when it makes a wheel.
- Lines 13–14 take
socket.gethostname() and socket.gethostbyname(hostname).
- Lines 17–22 put those into a dictionary as
hostname and ip_address, together with "package": "dbt-adapter" and "version": "0.1.0a2".
- Lines 25–31 encode the dictionary as JSON and POST it to
BEACON_URL with Content-Type: application/json and a 3-second timeout.
- Lines 32–34 swallow any error, so the install never fails, and then call the normal
install.run.
pyproject.toml (sha256 5038baf76023142199de43d1cbd8c78ec07d1713d07b5d282578ad39d47c784b, 14 lines):
- Lines 2–3 use the
setuptools.build_meta backend, which is why pip runs setup.py.
- Line 8 gives the description "POC package (beacon-only)".
- Line 9 lists the author as the template placeholder "Your Name".
- Line 14 declares a single package directory,
dbt-adapter. No file declares a dependency.
setup.cfg (sha256 1c473cbaee8da5fc46e7f0158794af5cea4414c34a3cf3f180c2001f5e38bd3e, 4 lines) holds only setuptools' default [egg_info] settings and does nothing else.
OSV's report says the same as the code: the package "overrides the install command in setup.py" and sends "basic information about the host". OSV gives the user name as one example of that information, but this setup.py does not send it; it sends the hostname. OSV also says importing the module reports to the same address. This review does not quote the module's code.
OSV also lists 0.0.0, whose summary is "Dummy dbt-adapter package for PyPI". This review does not quote that release's code and does not cover it.
Conclusion
phone-home: installing dbt-adapter 0.1.0a2 sends the machine's hostname, its local IP address and the package's name and version to a webhook.site address (setup.py lines 7–31). The package uses a name one letter away from the real dbt-adapters and has no other function. It does not read credentials, take commands or persist.
Timeline (UTC)
| When | What |
| 11/05/26 05:23:01 | dbt-adapter 0.0.0 is published to PyPI ("Dummy dbt-adapter package for PyPI") |
| 11/05/26 05:29:25 | dbt-adapter 0.1.0a2 is published to PyPI ("POC package (beacon-only)") |
| 11/05/26 06:58:26 | OSV publishes MAL-2026-18704, reported by Kamil Mańkowski (kam193), covering 0.0.0 and 0.1.0a2 |
If you installed it
If you meant dbt-adapters (with an s), uninstall dbt-adapter, install the real package, and pin the name in your requirements or lock file.
The package sent only your hostname, its local address and your public address to the webhook's owner. It read no secrets and left nothing running, so you do not need to rotate credentials because of it. To find machines or CI runners that installed it, look in your egress logs for HTTPS requests to webhook.site, made while pip was installing.
Indicators
- hosts
webhook.site- requests
POST https://webhook.site/<token> (HTTPS, 3-second timeout)Content-Type: application/json; body {"hostname", "ip_address", "package": "dbt-adapter", "version": "0.1.0a2"}- files
setup.py (sha256 67e203d1370bb52004f54675ab77758ed2e8bf1bfdb8d3342888e1c932809b88)- processes
pip's PEP 517 build_wheel hook running setup.py (the overridden install command)
Examined
- 0.1.0a2
sha256:b8b9be9ded8afbc3dfdd8bb8e58b489ef1e305bfbf377b3e68f0ed62f9f5b0d1
Links