Commit Graph

133 Commits

Author SHA1 Message Date
CarterPerez-dev f0ce950ac8 feat(marshalsea): close both audits, then build the three halves the contract promised
Two independent audits of the same tree, one executed and one static. Both were
worth running: the static pass found seven real defects the executed pass missed,
including the worst one here, and the executed pass found three the static pass
could not see because seeing them required running Ruby.

The release workflow could publish from any branch. The publish job carried no ref
condition and its tag check read `[ tag != expected ] && [ event = push ]`, so on a
workflow_dispatch the second clause was false, the && never fired, and control fell
straight through to rubygems/release-gem. Anyone with the Actions tab could ship a
mutable branch checkout to rubygems.org. The job is now gated on a pushed
refs/tags/marshalsea-v* ref, the version check is unconditional, and the manifest is
audited before the push step with a negative control proving a drifted lib file
turns it red.

Three payloads ran attacker code while the detector reported proceed. A
String-subclass hash key reaching a user #eql?, measured {eql: 1}; a gadget nested
in a bare Array key, measured {hash: 1}, 22 bytes hand-built; and a Range whose
endpoints dispatch #<=>, measured {cmp: 1}. All three were accepted under
deny_sinks_only and under strict with the class allowlisted, which is the documented
normal usage. They are blocked under every policy now.

The oracle that missed them dumped `{ key => nil }`. One key means no bucket
collision, so #eql? could never fire in the probe no matter how many key shapes were
added. Blind by construction, the exact defect class this project already had a rule
about. The corpus went further and asserted the String-subclass case was a precision
control, a positive claim that rejecting it would be a false positive. It is a
reject now, and the key rules are re-derived from research 02 section 4.2 rather than
grown case by case.

Range endpoints marshal as bare `begin`/`end`, not `@begin`/`@end`, because Range
uses a marshal compat dumper. The first constant was wrong and the test caught it.

The scanner's reachability filter contradicted its own thesis. Requiring zero arity
for ungated entry points excluded eql?, ==, <=>, []=, method_missing and
respond_to_missing? entirely: 85 candidates across those rows, 0 reachable. Only
hash and to_s survived, and research 02 section 4.2 verified to_s is never an entry
point, so 11 of 18 reachable results were a method Marshal.load does not invoke.
Entry points are now a table carrying gate, format and the arity the deserializer
supplies; links are a third gate value and are reported separately instead of
scored as entry points. Gated hooks are arity-checked too, so an arity-0
marshal_load that would raise ArgumentError is no longer called reachable.

Marshal.load reaches a private self._load through rb_funcallv, which ignores
visibility, while singleton_methods(false) does not report it. Adding
singleton_class.private_instance_methods immediately found Time._load on a stock
image, a real stdlib sink the scanner had never seen. Prism is error tolerant and
parse_definitions consumed .value without checking failure?, so a tree recovered
from four syntax errors produced a confident touches_state verdict; it is a
suppression now.

The parser accepted ivar-name and struct-member-name slots holding a fixnum, a
string or an array, the detector said proceed, and CRuby then raised
ArgumentError, so the defended route answered 500. The parser stays forensic on
purpose, because a sink hidden where a symbol belongs must stay visible, so the
anomaly is labelled on Result and the detector rejects on it. The target also
rescues the loader rather than trusting inspection.

Three things the contract promised and did not have.

The headline payload was not a chain. It built an ERB object past the @_init guard
and then both demonstrations called def_method themselves, so the canary was not a
consequence of Marshal.load. Research 04 line 292 and 05 line 982 already said the
real chain reaches def_module through
ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy, and 05 line 1143 listed
reproducing it as open. erb-def-module does that: the proxy sits in hash-key
position, ungated #hash dispatch lands in method_missing, target calls
@instance.__send__(:def_module), and ERB compiles the payload inside Marshal.load
with no application call. The old builder stays as erb-def-method and is labelled a
primitive. Three things only execution showed: the proxy undefines
instance_variable_set so setup has to go through a bound Object method; a real
deprecator holds a Proc and cannot be dumped, so the chain hand-builds one with
@silenced true and warn short-circuits before touching @behavior; and building
{proxy => 1} fires the payload in the builder's own process, so serialize splices a
key-position stream from a standalone dump and refuses any graph carrying an object
link, whose index would shift behind the hash node.

LoadGuard is the M6 runtime guard. A TracePoint on :call fires before a method body
runs, which is the veto a Marshal.load proc cannot give you. It watches the gated
hooks plus method_missing and respond_to_missing?, because a hook list without those
two is evaded by a respond_to_missing? proxy. hash and eql? are opt-in behind
strict:, since they are among the hottest methods in Ruby and BoundaryDetector
already catches key-position dispatch before any bytes load. It raises a
StandardError, never a SecurityError that would skip every rescue in the stack.

Its cost is not 1.4x. That figure is a property of the payload that was measured,
not of the guard. Enabling a TracePoint costs a near-constant ~46 microseconds per
load, so the ratio is decided by how much work the load does: 185.9x on 3 bytes,
40.4x on a 45-byte session cookie, 1.1x on 46 KB, 1.0x on 488 KB. The lab's own use
case is a session cookie, which is the worst case. A dated correction is written
back into research 03.

The Psych half exists now. Psych::Inspector reads a document through parse_stream,
revives nothing, and reports every !ruby/* tag with the method it would dispatch,
bounded on bytes, depth, nodes, aliases and documents. psych-init-with is the
matching chain. The target grows /yaml/unsafe and /yaml/safe so the spine of this
project is executable over HTTP: the same ERB object reaches code execution through
YAML.unsafe_load, and YAML.safe_load refuses it by checking the tag before revival.
The gate proves both layers independently, including a document the inspector
approves that Psych still refuses, so neither can alibi the other.

The target ran attacker Ruby on Docker's default bridge with outbound access and
installed sinatra, rackup and webrick unversioned. It now runs on an internal
network with cap-drop ALL, no-new-privileges, pid and memory ceilings and pinned
versions, with a control proving it cannot reach off the host. Creating that network
also proved --internal blocks the published port, so the gate drives the target from
a second container on the same network instead. The HTTP gate asserted body prefixes
and never captured status; it asserts exact status and body per endpoint now, which
immediately caught a bug in this very change where a nil sentinel conflated "the
loader refused" with the legitimate value nil.

Smaller: Chains.all filtered out a Base that was never registered, so the filter was
inert and its test vacuous; chains are discovered by directory glob now, per the
design's no-registry-to-rot contract. AFFECTED was shallow frozen, and mutating
metadata[:affected][2] flipped affects?("5.0.0") from true to false. Limits.permissive
keeps a depth cap on purpose and now says so, because lifting it trades a rescuable
DepthLimitError for an uncatchable SystemStackError. The README claimed a fixnum
width rejection its own test proves is unreachable. Regexp options were discarded
while the node still reported fully_decoded?.

The README is rebuilt to the repository's shape, and Deserialization Gadget Lab
takes project 41 in the root table, replacing Ghost on the Wire. CHANGELOG.md is
dropped from the gem manifest, the metadata and the packaging gate.

Full gate: 78 PASS, 0 FAIL across six stages, up from 58. 267 tests across seven
suites, from 194. Lint 0 across 37 files. Every rule added here ships with the
mutant that kills it.
2026-07-30 23:04:38 -04:00
CarterPerez-dev 7c1fab2240 docs(crypha): add learn/ track and surface the built project (M9)
Add the five-part learn/ folder (overview, concepts, architecture,
implementation, challenges) grounded in docs/research, with the
QR-from-ISO/IEC-18004 Reed-Solomon injection as the showpiece and crypha's
real capacities cited from the binary. Update the root README row from a
Python synopsis to the built Go project with Source Code and Docs links,
matching the nadezhda row.
2026-07-19 03:06:49 -04:00
Carter Perez 7a4f8a5792
Update README.md 2026-07-09 17:27:12 -04:00
Carter Perez 05d2eba906
Update README.md 2026-07-06 10:24:15 -04:00
Carter Perez 6593aa5689
Update README.md 2026-07-04 11:03:09 -04:00
Carter Perez 9dee035cb2
Update license reference in README 2026-07-04 10:57:30 -04:00
Carter Perez 8439e82902
Update README.md 2026-07-04 10:54:00 -04:00
Carter Perez a0407cdba2
Merge pull request #299 from CarterPerez-dev/project/zingela
Project/zingela
2026-07-04 10:49:41 -04:00
CarterPerez-dev ab42857882 completed 2026-07-04 10:43:16 -04:00
CarterPerez-dev d2f6f7bae4 docs: broaden CertGames positioning across roadmaps and resources 2026-06-30 10:22:31 -04:00
Carter Perez 0a5ba94a29
Update README.md 2026-06-30 03:19:46 -04:00
CarterPerez-dev e87efe7e29 i count the tiles every morning. today there's one more. there's always one more. 2026-06-18 19:28:21 -04:00
CarterPerez-dev 53fd886ed8 docs(hsm-emulator): M12 learn track + README flip
learn/: add 00-OVERVIEW, 01-CONCEPTS, 02-ARCHITECTURE, 03-IMPLEMENTATION, 04-CHALLENGES, and MECHANICS (the byte-by-byte crypto deep-dive). CONFORMANCE shipped in M11. Real-breach grounding, function/file code refs (no line numbers), no AI voice.

Project README: flip M0-stale to real M0-M11 (21 mechanisms, std.Io.randomSecure, roadmap done through M12, learn/ link table).

Root README: graduate HSM to a completed project (Full Source Code 32->33, C badge -> Zig, title + footer now link to source and learn/).

Verified docs-only: zig build test and zig build smoke both exit 0, smoke mechanisms=21, objdump -T shows only C_GetFunctionList. No source changed.
2026-06-02 07:28:08 -04:00
Carter Perez 9e7246e417
Update README.md 2026-05-24 18:09:32 -04:00
Carter Perez 79ca7006b3
Merge pull request #235 from CarterPerez-dev/project/canary-token-generator
Project/canary token generator
2026-05-18 00:44:30 -04:00
CarterPerez-dev 615efe051d update 2026-05-18 00:41:25 -04:00
Carter Perez 7aab0c6faf
Update README.md 2026-05-13 14:25:09 -04:00
CarterPerez-dev 4c25db7b1a docs(readme): add docs link for ai-threat-detection
AI Threat Detection row now has the same [Source Code] | [Docs] link
pair as the other advanced projects with learn/ content.
2026-05-13 14:05:16 -04:00
Carter Perez 8680e684d6
Update README.md 2026-05-10 01:53:25 -04:00
CarterPerez-dev 1b9fcbac13 add learn folder to IM MONITORING THE SITUATION DASHBOARD project 2026-05-08 04:43:29 -04:00
CarterPerez-dev 5e7f2c36de I'm being gangstalked by the CIA, they put a chip in my brain 2026-05-04 18:53:54 -04:00
Carter Perez 24c484386b
Update README.md 2026-04-29 03:44:54 -04:00
Carter Perez 30f88d3a6b
Update README.md 2026-04-19 13:24:02 -04:00
CarterPerez-dev e35d752289 feat: advanced honeypot-network project complete 2026-04-19 13:13:49 -04:00
Carter Perez cccd383b30
Merge branch 'main' into project/systemd-persistence-scanner 2026-04-15 19:37:43 -04:00
CarterPerez-dev 8c8a37c654 docs: add learn folder and update README for systemd persistence scanner 2026-04-15 19:21:56 -04:00
CarterPerez-dev 34465a1255 fix: CI nim action, sbom badge, and main README links
Replace broken jiro4989/setup-nim-action@v2 with direct choosenim
install. Add ebpf tracer and dlp scanner to lint matrix. Update SBOM
generator badge to Project #24 and add source/docs links in main
README. Bump project count to 24/67.
2026-04-11 05:52:55 -04:00
CarterPerez-dev d3fa5ea132 fix: update READMEs for ebpf tracer & dlp scanner
Add ASCII art, project number badges, justfile tip, and learn module
links. Add missing justfile to dlp-scanner. Update main README with
source code links and bump project count to 23/67.
2026-04-11 05:38:49 -04:00
Carter Perez c05671a38d
Merge pull request #145 from CarterPerez-dev/project/credential-harvester
feat: credential enumeration complete
2026-04-04 21:23:57 -04:00
CarterPerez-dev 65a82c84bd feat: credential enumeration complete 2026-04-04 21:22:50 -04:00
Carter Perez e96420176c
Merge branch 'main' into project/credential-harvester 2026-04-04 20:23:24 -04:00
CarterPerez-dev c1ec748dda feat: credential enumeration complete 2026-04-04 20:21:19 -04:00
CarterPerez-dev 8775585ee6 update main readme.md 2026-03-30 16:02:12 -04:00
CarterPerez-dev cf5df3c928 update main readme.md 2026-03-26 01:12:06 -04:00
CarterPerez-dev 261d5c2c16 better projects replacements 2026-03-25 07:36:17 -04:00
CarterPerez-dev d246b4a17e divine intellect god chose me 2026-03-22 21:55:19 -04:00
CarterPerez-dev 54515f748d 97% complete 2026-03-02 17:30:25 -05:00
CarterPerez-dev 4224b7d283 97% complete 2026-03-02 17:29:48 -05:00
CarterPerez-dev 9397b12a4a add learn folder, move hidden files, update root readme, add learn folder, add clang tidy, and format 2026-02-26 00:38:55 -05:00
Carter Perez bc6ee16629
Merge pull request #102 from CarterPerez-dev/project/secrets-scanner
Project/secrets scanner
2026-02-22 20:08:23 -05:00
CarterPerez-dev 294169a222 feat: Complete Go secrets scanner - Portia 2026-02-22 20:02:38 -05:00
Carter Perez 6f562664b9
Add contributors to Simple Port Scanner and Metadata Scrubber 2026-02-20 05:58:30 -05:00
CarterPerez-dev b04907cad8 feat: simple c2 beacon complete 2026-02-14 03:02:43 -05:00
Carter Perez ad5a7e5f7a
Update README.md 2026-02-11 11:02:55 -05:00
CarterPerez-dev ad40be1bf6 move docs to .github/ 2026-02-11 07:52:29 -05:00
Carter Perez 509ca89519
Update README.md 2026-02-09 07:32:13 -05:00
Carter Perez 81728d8da8
Update README.md 2026-02-09 07:31:21 -05:00
Carter Perez 0e28847add
Update README.md 2026-02-09 01:58:19 -05:00
Carter Perez e8d2958e48
Update Network Traffic Analyzer link and description 2026-02-01 20:33:55 -05:00
CarterPerez-dev a33423aa16 feat: complete network-traffic-analyzer 2026-02-01 20:26:28 -05:00