Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
name: Tests

on:
push:
pull_request:
workflow_dispatch:

permissions:
contents: read

jobs:
test:
name: Python ${{ matrix.python }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 10
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
python: ['3.10', '3.14']
steps:
- name: Check out repository
uses: actions/checkout@d23441a48e516b6c34aea4fa41551a30e30af803 # v6
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: ${{ matrix.python }}
- name: Run local-only tests
run: python -m unittest -v
- name: Check CLI help
run: python tinypool_options_rce_check.py --help
11 changes: 5 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,18 @@ before changing this project.

This repository covers only **CVE-2026-104849** (Tinypool worker-options prototype-pollution gadget). Its aliases
refer to the same exploit. Keep unrelated vulnerabilities in separate repositories.
The repository is an initialized research foundation. No checker, tests, or CI
workflow exists yet; never imply otherwise or document nonexistent commands.
The repository contains the offline checker `tinypool_options_rce_check.py`, synthetic tests and CI. Preserve the exact affected interval, disputed boundaries and reviewed fixed line; no network mode or application execution is implemented.

## Project map

- `advisory.json`: source-preserving research record; detection is disabled.
- `advisory.json`: enabled offline rule metadata with preserved research origin.
- `README.md`: exact scope, advisory snapshot, primary sources, and current status.
- `docs/IMPLEMENTATION.md`: local implementation and verification checklist.
- `LICENSING.md`, `CONTRIBUTING.md`, `BRAND_ASSETS.md`: licensing and contribution terms.

## Implementation constraints

Follow the established [node2shell-check](https://github.com/CompleteTech-LLC/node2shell-check) and [php2shell-check](https://github.com/CompleteTech-LLC/php2shell-check) conventions. Prefer a small, auditable,
Follow the established [node2shell-check](https://github.com/completetech-security/node2shell-check) and [php2shell-check](https://github.com/completetech-security/php2shell-check) conventions. Prefer a small, auditable,
dependency-free checker when appropriate. Do not turn this project into a generic
product scanner or execute exploit payloads.

Expand All @@ -42,8 +41,8 @@ disabled until a real implementation is reviewed and tested.

## Validation and delivery

Use focused synthetic cases and local-only fixtures for meaningful behavior tests
once code exists. Do not invent passing tests, add prose-only tests, or publish
Use focused synthetic cases and local-only fixtures for meaningful behavior tests.
Do not invent passing tests, add prose-only tests, or publish
private assessments. Keep CLI, schemas, methodology, and README aligned. Distinguish
local results from hosted CI on the exact published commit. Preserve unrelated
work and follow the licensing and brand policies linked above.
18 changes: 1 addition & 17 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,6 @@
# Contributing

This repository is initialized for **CVE-2026-104849**. Checker implementation is
pending; start with the [implementation checklist](docs/IMPLEMENTATION.md).
Submit focused pull requests for this exploit. Report flaws requiring private
disclosure according to [SECURITY.md](SECURITY.md).

## Development expectations

Follow [AGENTS.md](AGENTS.md). Prefer a standalone Python 3.10+ checker with no
third-party runtime/test dependencies when suitable. Validate primary sources
before encoding affected or fixed ranges. Preserve evidence provenance and
`unknown` for missing or conflicting facts. Keep exploitability `not_tested`.

Use offline inventories, synthetic examples, mocks, and local fixtures. Do not
commit credentials, real target lists, private reports, or exploit payloads.
Network detection must be justified, optional, ordinary, bounded, and authorized.
Document implemented behavior and actual commands; no checker commands or test
suite are available in this foundation yet.
Read AGENTS.md and README.md. Run `python -m unittest -v`, `python tinypool_options_rce_check.py --help` and `git diff --check`. Use synthetic evidence only, verify primary sources before changing ranges, keep source conflicts unknown, and never run application code or send exploit payloads. Preserve safe publication, bounded reads, output escaping and complete=false after interruption. Review and exact-head hosted CI precede merge.

## Licensing of contributions

Expand Down
157 changes: 37 additions & 120 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,140 +1,57 @@
<p align="center">
<img src="docs/images/banner.png" alt="tinypool-options-rce-check by CompleteTech LLC" width="100%">
</p>
# tinypool-options-rce-check

<p align="center">
<img src="https://img.shields.io/badge/status-checker%20planned-F59E0B" alt="Status: checker planned">
<img src="https://img.shields.io/badge/detection-disabled-64748B" alt="Detection disabled">
<a href="LICENSING.md"><img src="https://img.shields.io/badge/license-AGPL--3.0%20%7C%20commercial-64748B" alt="AGPL-3.0 or commercial license"></a>
</p>
Offline evidence checker for **CVE-2026-104849 — Tinypool worker-options prototype-pollution gadget**. Python 3.10+, standard library only. The executable can be copied alone. It never contacts websites, imports application code, runs a package manager, or executes exploit payloads.

<p align="center">
<b>Tinypool worker-options prototype-pollution gadget</b><br>
CVE-2026-104849 · GHSA-85c8-ppgw-ccpr · research only, no checker yet
</p>
```sh
python tinypool_options_rce_check.py --version 2.1.2 --format json
python tinypool_options_rce_check.py --inventory examples/inventory.example.json --format html --output report.html
python tinypool_options_rce_check.py --csv-list inventory.csv --fail-on-finding
python tinypool_options_rce_check.py --help
python -m unittest -v
```

---
## Reviewed rules

> **Repository initialized; checker implementation pending.**
> This project currently contains research and an implementation checklist.
> It does not assess systems or provide an executable detection rule.
Primary advisory and reviewed database retrieved 2026-10-24. A public URL cannot provide installed package inventory. Obtain each deployed package instance's exact version and provenance; declarations and local workstation versions are not deployment evidence.

`tinypool-options-rce-check` is the planned home of a checker for **CVE-2026-104849**, a Tinypool worker-options prototype-pollution gadget. Today it holds source-backed research and a work plan only. It sends no requests, runs no exploit payloads, and reports no results. When built, it is meant to report uncertainty honestly: missing, conflicting, or vendor-qualified evidence stays `unknown`, never "safe".

By [CompleteTech LLC](https://complete.tech).

## Status and what is planned

There are no checker commands, installation steps, downloadable binaries, test results, or CI claims, so there is no Quick start yet. To follow or contribute to the work:

1. Review [advisory.json](advisory.json) and the [primary sources](#primary-sources).
2. Work through the exploit-specific [implementation checklist](docs/IMPLEMENTATION.md).
3. Read [AGENTS.md](AGENTS.md), [CONTRIBUTING.md](CONTRIBUTING.md), and [SECURITY.md](SECURITY.md) before contributing.

## Planned report layout

<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/images/report-dark.png">
<img src="docs/images/report-light.png" alt="Illustrative placeholder layout of a planned report; no checker is implemented yet" width="900">
</picture>
</p>

<p align="center"><sub><b>Illustrative only.</b> A layout sketch with placeholder values on reserved <code>example.*</code> domains. No checker, report format, or result exists yet.</sub></p>

## What the results will mean (planned)

The status vocabulary below is planned and taken from this repository's [implementation checklist](docs/IMPLEMENTATION.md). It is not implemented.

| Status (planned) | Intended meaning |
| Example reported version | Result |
| --- | --- |
| `potentially_affected` | Evidence matches this advisory's documented range or condition. Not confirmed exploitability. |
| `fixed_version_reported` | A supported comparison shows a reported fixed version. Not a guarantee or verified deployed patch. |
| `unknown` | Missing, malformed, conflicting, prerelease, vendor/custom-build, possible-backport, or uncovered-future evidence. |
| 2.0.9 | `potentially_affected` |
| 2.1.0 | `potentially_affected` |
| 2.1.1 | `unknown` |
| 2.1.2 | `fixed_version_reported` |
| 2.1.3 | `fixed_version_reported` |
| 2.2.0 | `unknown` |
| 3.0.0 | `unknown` |

Exploitability remains `not_tested` for every future finding.
pool.run(task) alone is not the documented trigger. Surface 2.1.1 source conflict and do not report clean. Maintainer severity High differs from database Critical; retain provenance.

| Reported in the advisory data (research only) | Value |
| --- | --- |
| Affected | `<=2.1.0` (maintainer); `<2.1.2` (GitHub Reviewed) |
| Confirmed affected | `<=2.1.0` |
| Conflicting source evidence | `2.1.1` (must not be reported clean) |
| Fixed in | `2.1.2` |
The reviewed fixed line is `2.1.x`; future lines remain unknown rather than extrapolating a patch claim. Versions outside the exact affected interval remain unknown, including older releases that might have other flaws. Missing, conflicting, malformed, prerelease, qualified, custom/vendor builds remain unknown. `fixed_version_reported` only describes a version claim; it never attests installed patches or safety. `potentially_affected` is not confirmed exploitability. Every row retains `exploitability: not_tested`.

These values are research-only and come from [advisory.json](advisory.json); they are not an enabled rule.
## Preconditions

> [!IMPORTANT]
> **Nothing here is a test result.** The repository is research only and detection is disabled. `pool.run(task)` alone is not the documented trigger, so a version match would never prove exposure or exploitability. A reported fixed version is not a guarantee of safety, and the `2.1.1` source conflict must stay `unknown`.

## One exploit, one repository

| Field | Scope |
| Optional operator observation | Meaning |
| --- | --- |
| Exploit identifier | `CVE-2026-104849` |
| Aliases for this same exploit | `GHSA-85c8-ppgw-ccpr` |
| Research verification date | 2026-10-23 |
| Implementation state | `planned` |
| Detection rule | **Disabled — research only** |

This repository is dedicated to **CVE-2026-104849**. Aliases and multiple affected
products identify this same exploit; they do not create additional scanner scopes.
Future fixes for different vulnerabilities belong in independent repositories.

## Advisory snapshot

The following is source-backed research for implementation planning. It is not a
test result, a live rule feed, or an attestation that a deployed system is patched.

### Affected versions or conditions

<=2.1.0 (maintainer); <2.1.2 (GitHub Reviewed)

### Reported fixes or remediation

2.1.2

### Deployment preconditions to establish

- caller supplies pool.run options object
- options lacks an own filename property
- separate prototype-pollution primitive
- attacker-controlled worker module available

### Evidence notes and limitations

- pool.run(task) alone is not the documented trigger. Surface 2.1.1 source conflict and do not report clean. Maintainer severity High differs from database Critical; retain provenance.

## How it works (planned)

The intended checker follows the evidence and reporting conventions of
[node2shell-check](https://github.com/CompleteTech-LLC/node2shell-check) and [php2shell-check](https://github.com/CompleteTech-LLC/php2shell-check):

- Prefer offline version, inventory, or configuration evidence appropriate to this exploit.
- Keep version state, documented preconditions, evidence provenance, and uncertainty separate.
- Preserve `exploitability: not_tested`; never run exploit payloads or confirm compromise.
- Keep missing, malformed, conflicting, vendor-qualified, prerelease, and uncovered versions `unknown`.
- Produce human-readable findings and machine-readable JSON/CSV; document each output before release.
- Add bounded, explicitly selected passive network behavior only if it provides useful evidence.
| `caller_supplies_pool_run_options_object` | caller supplies pool.run options object |
| `options_lacks_an_own_filename_property` | options lacks an own filename property |
| `separate_prototype_pollution_primitive` | separate prototype-pollution primitive |
| `attacker_controlled_worker_module_available` | attacker-controlled worker module available |

These capabilities are **planned**, not implemented. There are currently no
checker commands, downloadable binaries, test results, or CI claims.
Each observation is boolean or null, is unverified, and never changes the package-version result. No source search, taint analysis, reachability test, or runtime evaluation is performed. Absent observations do not establish mitigation.

## Primary sources
## Evidence and reports

1. [Repository advisory](https://github.com/tinylibs/tinypool/security/advisories/GHSA-85c8-ppgw-ccpr)
2. [GitHub Advisory Database](https://github.com/advisories/GHSA-85c8-ppgw-ccpr)
JSON accepts one object or an array of objects. Required: integer `schema_version: 1`, string `package_version`. Optional: `package: "tinypool"`, `label`, `build_source`, and the observation keys above. Unknown or duplicate keys, wrong types, non-finite numbers and malformed inputs are rejected. CSV requires `package_version`; optional columns are label, build_source, and observation keys (`true`, `false`, blank). CLI `--version` is repeatable; values are separate instances, not evidence reconciliation for a single instance. `--build-source` and observation flags (underscore becomes hyphen) apply to CLI versions.

The research date records the supplied verification snapshot. Recheck primary
advisories before enabling any detection logic, and retain contradictory evidence.
Only regular UTF-8 input files are accepted. Limits: 4 MiB/file, 100 files, 10,000 entries total, 512 characters/text field. Work from stable copies; checks are not a filesystem sandbox. JSON, formula-neutralized CSV and escaped script-free HTML share assessments. Output files publish atomically and do not overwrite existing files without `--force`; inputs remain protected even with force.

## Documentation
Exit 0: completed run; 1: potentially affected with `--fail-on-finding`; 2: argument/input/output error; 130: interrupted, preserving completed observations when possible. Interruption during stdout can leave a truncated document and never appends a second report. Unknown does not count as a finding-gate failure or as a clean result. Reports contain operator data; keep real targets, inventories and reports out of commits.

- [Implementation checklist](docs/IMPLEMENTATION.md): local work plan and verification gates
- [advisory.json](advisory.json): source-preserving research record (detection disabled)
- [AGENTS.md](AGENTS.md) · [Contributing](CONTRIBUTING.md) · [Security policy](SECURITY.md)
## Sources and delivery

## License
- https://github.com/tinylibs/tinypool/security/advisories/GHSA-85c8-ppgw-ccpr
- https://github.com/advisories/GHSA-85c8-ppgw-ccpr

Dual licensed: [AGPL-3.0](LICENSE), or a separate commercial agreement with CompleteTech LLC. See [LICENSING.md](LICENSING.md) and the [contribution terms](CONTRIBUTING.md#licensing-of-contributions). Names and branding are governed by [BRAND_ASSETS.md](BRAND_ASSETS.md).
[Synthetic report](docs/example-report.html), [reference](docs/REFERENCE.md), [implementation status](docs/IMPLEMENTATION.md), [AGENTS](AGENTS.md), [contribution terms](CONTRIBUTING.md), [security policy](SECURITY.md), [license](LICENSE), [dual licensing](LICENSING.md). Bounded input and reporting helpers are bundled from the reviewed Node.js checker at `74aa57ba5df05c34d17ae67912cd26ec2335201b`, with package-specific range comparison and the mixed-whitespace CSV fix. No companion repository is needed at runtime.

Copyright © 2026 CompleteTech LLC.
CSV `record_type=result` rows are asset observations. A zero-result report has a `record_type=summary` row carrying completeness, schema, rule date, CVE and `not_tested`; it is not an asset finding.
8 changes: 3 additions & 5 deletions SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,10 @@ revision when possible. No response-time guarantee is made.

## Advisory scope and implementation status

This project is dedicated to **CVE-2026-104849**. It currently provides research
and an implementation plan. No scanner, exploit verification, or security
assessment has been implemented. The advisory record is explicitly disabled.
This project is dedicated to **CVE-2026-104849**. It provides offline package-version evidence triage. It does not scan deployed systems or test exploitability.

Future output must distinguish reported versions and configuration hints from
confirmed exposure. Exploitability remains `not_tested`. Use future assessment
Output must distinguish reported versions and configuration hints from
confirmed exposure. Exploitability remains `not_tested`. Use assessment
features only for authorized targets; project development alone authorizes no
network scanning. Keep real inventories and assessment results outside the repo.

Expand Down
1 change: 1 addition & 0 deletions SHA256SUMS
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
bfcf2baa2b206c708ff49dae878eb99583fdca5ea5889060dc402421c913a1cf tinypool_options_rce_check.py
28 changes: 20 additions & 8 deletions advisory.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,16 +28,28 @@
],
"verification": "verified_with_boundary_discrepancy",
"category": "Packages",
"status": "new",
"implementation_status": "planned",
"verified_at": "2026-10-23",
"repository_url": "https://github.com/CompleteTech-LLC/tinypool-options-rce-check",
"status": "implemented",
"implementation_status": "implemented",
"verified_at": "2026-10-24",
"repository_url": "https://github.com/completetech-security/tinypool-options-rce-check",
"schema_version": "1.0",
"record_type": "research_only",
"detection_enabled": false,
"implementation_complete": false,
"record_type": "implemented_rule",
"detection_enabled": true,
"implementation_complete": true,
"assessment_performed": false,
"exploitability": "not_tested",
"scope_policy": "One distinct exploit per repository; aliases and affected products share this scope.",
"research_notice": "Source research for a planned checker; not an executable rule or assessment result."
"research_notice": "Original research foundation preserved in research_origin and Git history. Offline evidence implementation locally reviewed and tested; exact-head hosted CI is a separate release gate. No deployed-target assessment is claimed.",
"research_origin": {
"record_type": "research_only",
"implementation_status": "planned",
"verified_at": "2026-10-23",
"detection_enabled": false,
"implementation_complete": false,
"research_notice": "Source research for a planned checker; not an executable rule or assessment result.",
"sources": [
"https://github.com/tinylibs/tinypool/security/advisories/GHSA-85c8-ppgw-ccpr",
"https://github.com/advisories/GHSA-85c8-ppgw-ccpr"
]
}
}
Loading
Loading