Skip to content

feat: dataset adapters, per-platform publish policy, takedown and outreach drafts - #2

Merged
0xmanhnv merged 2 commits into
mainfrom
feat/dataset-adapters
Oct 10, 2026
Merged

0xmanhnv merged 2 commits into
mainfrom
feat/dataset-adapters

Conversation

@0xmanhnv

Copy link
Copy Markdown
Member

Merge after #1 (stacked on feat/initial-collector; the diff against main includes #1 until it merges).

What

  • Adapters bounty-targets (arkadiyt/bounty-targets-data: HackerOne, Bugcrowd, Intigriti, YesWeHack) and pd-bounty (projectdiscovery/public-bugbounty-programs). Files are read at one commit resolved per run (raw URLs contain the commit; the resolve call uses ETag caching), size and record caps, strict parsing; the program page must sit on the platform host or the record is skipped.
  • Schema: target confidence published_by_platform; provenance gains dataset, dataset_commit, original_platform, original_url (all four together or none).
  • Publish policy policy/platforms.json: per platform publish (default false for everything except self-hosted), attribution, takedown_contact, reason; unlisted = not published; excluded_programs for program-level takedown. Applied to the finished snapshot and to the previous release (switching a platform off emits program_dropped). A signed build does not fetch unpublished dataset platforms.
  • build --local-only: ignores the policy, unsigned bundle marked collector.local_only; sign refuses it.
  • TAKEDOWN.md; unsent permission drafts in docs/outreach (6 platforms); README sources table (ingest / publish / reason) and NOTICE.

Threat model

  • Restricted platform data must not leave through the signed feed: policy filter on records (platform and original platform), changes, source counts and manifests; test asserts every publish=false platform in the shipped policy is absent from the written output. Default policy publishes only self-hosted.
  • Poisoned or reshaped dataset: array shape enforced, caps, commit must be 40 hex, program URL host-pinned to the platform, all targets go through the same scope rules (private ranges, public suffixes, wide CIDRs rejected).
  • Targets are suggestions: published_by_platform is never permission to test.

Tests

Recorded fixtures only (no network): go test ./... green. Also ran the real binary on pd-bounty (802 programs local-only, 226 signed-mode).

Follow-up

The OpenCTEM importer must accept published_by_platform and the new provenance fields before a bundle with them is published; with the default policy no such record is published yet.

Nguyen Manh added 2 commits October 10, 2026 05:03
Collects public bug-bounty and vulnerability-disclosure programs from open,
machine-readable sources, normalises them into one record format with typed
scope, validates every record and scope entry, and publishes a signed
snapshot and delta per run.

- sources: disclose.io diodb (CC0-1.0) and RFC 9116 security.txt over the
  CISA dotgov-data federal domain list (CC0-1.0) plus a repository seed file
- polite fetch client: named User-Agent and contact, robots.txt, one request
  per second per host, conditional requests, size caps, public addresses only
- scope rules: public suffixes, reserved names, private/reserved ranges and
  CIDRs wider than /16 or /48 are rejected with the reason; out of scope wins
- change log per run: programs added/closed/reopened/dropped, targets
  added/removed/modified, rules, terms and status changes
- bundle and trust model shared with the vulnerability feed: DSSE envelopes,
  offline root and versioned key set, monotonic sequence, 7-day expiry
- daily publish workflow (build job without the key, publish job in the
  publish environment); JSON Schemas; recorded fixtures, no network in tests
…, outreach drafts

Adds adapters for two public aggregate datasets of bug-bounty program
listings (read at one resolved commit, provenance per record, targets
marked published_by_platform), a per-platform publish policy so only
allowed platforms reach the signed feed, a local-only unsigned bundle
mode, TAKEDOWN.md and unsent permission-request drafts.
@0xmanhnv
0xmanhnv merged commit a1fd8fd into main Oct 10, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant