gcp-log-poc on PyPI sent all environment variables to a Google Cloud log at install and import, caught by Vigilance on 7 November 2026.
On 7 November 2026, the PyPI package gcp-log-poc went up in three versions, 0.0.1, 0.0.2 and 0.0.3, in about 30 minutes. Every version reads all environment variables of the Python process and sends them to a Google Cloud Logging log. It does this when pip installs the package and again each time Python imports it.
The package has no other function. The Google Cloud key that it uses to write the log is inside the package.
What happened
The package ships only a source download, so pip runs setup.py when it installs the package. The user does not need to call any function. The same code is in gcp_log_poc/__init__.py, so it runs again at every import.
Both files do the same steps:
- They decode a Google Cloud service account key that is stored in the file as base64 text. The key belongs to the account
pypi-log-writer@nginxinc.iam.gserviceaccount.com. - They collect every environment variable of the process with
dict(os.environ). Environment variables often hold tokens, cloud keys and CI secrets. - They add the host name, the user name, the working directory, the operating system and the Python version.
- They write all of it as one log entry to Google Cloud Logging, under the logger name
python-smoke-test. The entry marks the event asINSTALLorIMPORT.
Version 0.0.1 already sent the full environment. Version 0.0.2 added one thing: it reads the public IP address of the machine from https://api.ipify.org and adds it to the log entry. The data goes to a Google Cloud project that the user did not choose.
Vigilance Sentinel read version 0.0.1 at 19:06 UTC, 69 seconds after it went up. That read used a new first-scan mode that was in a test phase, so it did not send the version to the judge.
Vigilance caught version 0.0.2 at 19:16 UTC on 7 November 2026, 1 minute 12 seconds after it went up on PyPI. The first bad version, 0.0.1, went up at 19:05 UTC. Counted from that upload, the time to catch was 10 minutes 59 seconds. Vigilance found it first. The first public record, the OSV record MAL-2026-18753, came out at 19:53 UTC, 37 minutes 10 seconds after the catch.
PyPI quarantined the project on 7 November 2026. No files are left to install.
Affected versions
- 0.0.1, uploaded 7 November 2026 at 19:05 UTC. Sends the environment, host, user and system data at install and import.
- 0.0.2, uploaded at 19:14 UTC. Adds the public IP address.
- 0.0.3, uploaded at 19:35 UTC. The OSV record lists it with the other two.
- No clean version exists. PyPI quarantined the project on 7 November 2026.
Indicators of compromise
- Package name
gcp-log-poc, any version. - Python package folder
gcp_log_pocin a site-packages directory. - HTTPS requests to
logging.googleapis.comfrom a pip install or from a Python process that does not use Google Cloud. - A request to
https://api.ipify.orgfrom a pip install or a Python import. - Google Cloud service account
pypi-log-writer@nginxinc.iam.gserviceaccount.comand logger namepython-smoke-test.
How to check
Check whether the package is installed.
pip show gcp-log-poc
Look for its folder in every Python environment on the machine, including virtual environments and CI caches.
find / -type d -name "gcp_log_poc*" 2>/dev/null
Search the pip logs and lock files for the name.
grep -rl "gcp-log-poc" ~/.cache/pip requirements*.txt poetry.lock uv.lock 2>/dev/null
What to do now
- Uninstall the package with
pip uninstall gcp-log-poc. - Find every place that installed or imported it: developer machines, CI runners, containers and servers.
- Treat every environment variable that those processes held as exposed. Rotate each token, cloud key, password and CI secret.
- Check the cloud and CI audit logs for use of those secrets after the install time.
- Pin your dependencies and review new packages before you install them.
What Vigilance would show (rebuilt from public reports)
Vigilance compares the version you trust with the new one and names the file that gained a new power. The block below is rebuilt from the public reports in the words Vigilance prints. It is not a captured scan, because the malicious release is not redistributed.
files scanned: 54 HEADS UP 1 file can now do things the old version could not. The rest changed and gained nothing. CHANGED setup.py It now runs a command on its own when it is installed and reads saved passwords and access keys. It did not before.
Frequently asked questions
What does gcp-log-poc do?
It reads every environment variable of the Python process, adds host and user data, and writes all of it to a Google Cloud log. It does this at pip install and at every import.
Which gcp-log-poc versions are malicious?
Versions 0.0.1, 0.0.2 and 0.0.3. Each one sends the environment at install and import. Version 0.0.2 and later also send the public IP address.
How fast did Vigilance catch gcp-log-poc?
Vigilance caught version 0.0.2 1 minute 12 seconds after it went up, and 10 minutes 59 seconds after the first bad version went up. The first public record came out 37 minutes 10 seconds after the catch.