FourIsNotRandom
Detection-only CLI (fourisnotrandom) that fingerprints software versions and TLS/CA configuration to report exposure to a small set of currently relevant advisories.
This tool performs read-only version/fingerprint checks only. It does not exploit, does not send attack payloads, and must only be run against systems you own or are authorized to assess.
What it checks
| Area | Advisories | Detection methods |
|---|---|---|
| PHP | CVE-2026-109618, CVE-2026-109619 | Local php -v/php -i, HTTP headers, Docker/FS manifests, webroot app stacks |
| eMudhra CA | CVE-2026-111943 / related distrust | TLS chain digests, PEM/keystore files, Docker CA bundles, Go + certifi versions |
| GitLab | CVE-2026-110264, CVE-2026-97229 | Public /help or /api/v4/version (read-only) |
| LiteLLM | Malicious 1.107.0 release |
Exact pin in pip env / requirements / lockfiles / Docker |
No CIDR sweeps: every run requires an explicit host, URL, path, image name, or a targets file of discrete entries.
Install
python -m pip install -U pip
pip install -e ".[dev]"
fourisnotrandom --help
Auditing this tool's own dependencies
Run pip-audit against the pinned requirements file - not bare pip-audit:
pip-audit -r requirements.txt
A bare pip-audit run audits your entire environment and will also flag the
venv's bootstrap pip package, which is unrelated to this tool's dependencies.
Use pip-audit -r requirements.txt so findings reflect only what this project
declares.
Usage
# PHP
fourisnotrandom php --local
fourisnotrandom php --local --php-bin /usr/bin/php8.3
fourisnotrandom php --url https://example.com/
fourisnotrandom php --fs /var/www/html
# eMudhra / toolchains
fourisnotrandom emudhra --host example.com
fourisnotrandom emudhra --path /etc/ssl/certs
fourisnotrandom emudhra --docker my-image:tag
fourisnotrandom emudhra --toolchains
# GitLab (both CVSS 10.0 CVEs evaluated separately)
fourisnotrandom gitlab --url https://gitlab.example.com
# LiteLLM exact compromised pin
fourisnotrandom litellm --env
fourisnotrandom litellm --path .
fourisnotrandom litellm --docker ghcr.io/berriai/litellm:v1.107.0
# Explicit target list only (global flags before the subcommand)
fourisnotrandom --format json all --targets-file targets.txt
fourisnotrandom --format json emudhra toolchains
Exit codes: 0 = no FAIL, 1 = at least one FAIL, 2 = tool/config error.
Advisory data (editable)
Bundled under src/fourisnotrandom/data/:
| File | Contents | How to refresh |
|---|---|---|
fixed_versions.yaml |
PHP floors, GitLab per-CVE floors, Go floors, certifi floor, LiteLLM pin | Edit YAML; or pass --config PATH |
compromised_hashes.json |
Compromised eMudhra intermediate digests | Replace file or fourisnotrandom update-hashes --from PATH |
php_apps.yaml |
CMS/webroot path fingerprints | Edit YAML |
Data provenance
- PHP floors: PHP project security releases (8.2.35, 8.3.36, 8.4.27, 8.5.12). Branches ≤8.1 have no upstream fix.
- GitLab: Official critical patch notes for CVE-2026-110264 (Oct 21) and CVE-2026-97229 (Oct 12). Both are reported separately so an Oct-12-only patch does not look “fully covered.”
- eMudhra hashes: Certificate SHA-256 fingerprints from Cisco Talos “Compromised eMudhra intermediate certificates” (Oct 21, 2026), citing Mozilla Bugzilla 2083449. The scanner matches either full-cert SHA-256 or SPKI SHA-256 against the configured set (Talos publishes cert fingerprints; Go’s CVE-2026-111943 fix matches SPKI - dual match avoids assuming hash type after a refresh).
- certifi: Floor
2026.10.18(first release blocking compromised roots).2026.10.19restores some legitimate emSign roots (stability), not a security boundary. - Go: Fixed in 1.27.3 / 1.26.10 (CVE-2026-111943).
- LiteLLM: Exact malicious PyPI/Docker release
1.107.0only.
# Refresh eMudhra hash list from a JSON file with the same schema
fourisnotrandom update-hashes --from ./my-hashes.json
Safety
Read-only / authorized use only. This tool fingerprints versions and TLS/CA material. It does not exploit, does not send attack payloads, and must only be run against systems you own or are authorized to assess.
- Fingerprints only: versions, headers, banners, cert digests, read-only
php.inivalues. - Does not send session.upload_progress exploits, memory-corruption probes, or any PoC payloads.
- Does not scan networks you did not name explicitly.
- Rejects CIDR ranges and bare wildcards - every target must be an explicit host, URL, or path.
Metadata
Release files for fourisnotrandom 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| fourisnotrandom-0.1.0.tar.gz | 33.5 kB | Without provenance | Details for fourisnotrandom-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| fourisnotrandom-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for fourisnotrandom-0.1.0-py3-none-any.whl |
Total release size: 67.3 kB
Release files / fourisnotrandom-0.1.0.tar.gz
| Download URL | fourisnotrandom-0.1.0.tar.gz |
|---|---|
| Size | 33.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4713cdddfcd3b15a9c8d22172db55f0a5bd95e26e875bf354f44816eda43011f
|
|
BLAKE2b-256 checksum How to use checksums |
5105dfab87241a1ffd52ff15b51028107a8ecabc7598b3ccc09f54dab2fdc6ff
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.4
|
Release files / fourisnotrandom-0.1.0-py3-none-any.whl
| Download URL | fourisnotrandom-0.1.0-py3-none-any.whl |
|---|---|
| Size | 33.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8b498cb0001a0a59dfe4afb57bc696613e1d21b9f4387e77fd61d9c31887a384
|
|
BLAKE2b-256 checksum How to use checksums |
a556d5b37c6a6047f7934be4982c4a71bb66a4149bd523314b198d1207468d6c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.4
|
Security for fourisnotrandom 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.