KindaRails2Shell / CVE-2026-66066
Executive Summary
CVE-2026-66066, commonly called KindaRails2Shell, allows a remote unauthenticated attacker to use crafted Active Storage uploads and libvips variant processing to read files accessible to the Rails application process. Rails assigns CVSS v4 9.5; fixed Active Storage versions are 7.2.3.2, 8.0.5.1, and 8.1.3.1, with libvips 8.13 or later required.
The most valuable detection is not an endpoint IOC search. The known read primitive executes inside the Rails/libvips process and leaves durable Active Storage database/object-store artifacts. Falcon CQL in this pack therefore focuses on post-exploitation behavior: Ruby or web workers spawning shells/utilities, unusual outbound connections, and unexpected listeners. Native database, object-store, and request-log hunts remain the authoritative exploitation test.
Source Review & Web Hunter Notes
| Tier | Source / date | Key finding | Carry forward |
|---|---|---|---|
| T1 | Rails GHSA-xr9x-r78c-5hrm 2026-07-29 | Affected/fixed versions, prerequisites, CVSS 9.5, secret-rotation and libvips requirements. | Yes |
| T1 | JPCERT-AT-2026-0021 2026-07-30; updated 2026-08-03 | Public exploit code observed; urges compromise investigation and credential rotation. | Yes |
| T1 | Rails attack trace 2026-07-31 | Direct-upload and representation chain; crafted MAT/HDF5 structure; in-process file-read path. | Yes |
| T1 | Rails investigation guide 2026-07-31 | Three durable artifacts, cleanup blind spot, request-log joins, and limits of a clean result. | Yes |
Confidence: High. Core facts agree across vendor and national CERT sources. No campaign-specific domains, IPs, hashes, or filenames were published; none are invented here.
Hunt Brief & Attack Chain
Detection hypotheses
- H1 · High: a compromised Rails worker may spawn a shell or command utility not expected in normal image processing.
- H2 · Medium: a compromised Ruby/Rails process may invoke download, scripting, or networking tools for second-stage execution.
- H3 · Medium: a Ruby/Rails worker may connect to uncommon remote ports after secret theft or RCE.
- H4 · Medium: a Ruby/Rails or shell process may create an unexpected listening socket.
- H5 · Medium: a Ruby-spawned shell may reference Rails secrets, environment files, SSH keys, or cloud credentials.
Attack chain
| Step | Observed / documented behavior | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Crafted blob created through the Active Storage direct-upload endpoint with attacker-declared image content type. | Rails request log; Active Storage database/object store | POST path, unattached blob, crafted MAT header |
| 2 | A genuine harvested variation key is combined with the crafted blob signed ID at the representation endpoint. | Rails/proxy request logs | Representation GET after direct upload |
| 3 | libvips/libmatio/HDF5 reads an attacker-selected file and renders bytes into a stored variant. | In-process; Active Storage variant records and object store | EDR GAP Native forensic sweep |
| 4 | Process-readable secrets may be exposed, enabling session forgery, cloud/database access, lateral movement, or RCE. | Identity, cloud, database, endpoint and network telemetry | Secret-use anomalies; post-exploit child process/network hunts |
| 5 | Optional attacker cleanup may attach then purge the source blob and derived evidence. | Rails request logs and database history | Destroy/update routes accepting signed blob IDs |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context / expiry |
|---|---|---|---|---|
| Atomic IOC | None published | — | Do not block | No campaign-specific hash, domain, IP, or filename was disclosed. |
| Behavioral artifact | MAT header begins MATLAB 5.0 while bytes 124–127 encode MAT 7.3 dispatch/endian fields | High | Hunt | Known crafted-object discriminator; inspect first 128 bytes. |
| Database artifact | Unattached crafted blob plus active_storage_variant_records row | High | Investigate | Variant record indicates transformation occurred. |
| Stored evidence | Variant image attached to the variant record | High | Preserve | May contain exfiltrated bytes as pixel values. |
Affected Surface & Telemetry Matrix
| Surface | Required condition / telemetry | Priority | Gap risk |
|---|---|---|---|
| Rails / Active Storage | Vulnerable Active Storage; untrusted uploads; :vips variant processor | Critical | Application inventory required |
| libvips / ruby-vips | libvips loader set and linked libraries; version/config evidence | Critical | Package inventories may not show runtime linkage |
| Rails request logs | Direct-upload and representation routes, source address, user agent, authenticated identity | Critical | Retention may be short |
| Active Storage DB/object store | Blob, attachment, variant-record rows; object ranged reads; lifecycle history | Critical | Cleanup/lifecycle may remove evidence |
| Falcon Linux endpoint | ProcessRollup2, SyntheticProcessRollup2, NetworkConnectIP4, NetworkListenIP4 | High | Exploit primitive is in-process |
| Downstream services | Cloud, DB, IdP and third-party audit logs tied to rotated credentials | High | Secret theft may be used off-host |
ATT&CK Mapping
| Tactic | Technique | Behavior | Query / control |
|---|---|---|---|
| Initial Access | T1190 · Exploit Public-Facing Application (analyst mapping) | Crafted Active Storage direct upload and representation request | Native logs; M1051, M1031 |
| Credential Access | T1552.001 · Credentials in Files (analyst mapping) | Read process environment, Rails master key/credentials, cloud or DB credentials | Native forensics; Q5; M1022, M1041 |
| Execution | T1059.004 · Unix Shell (potential follow-on) | Rails/Ruby worker spawns a shell after RCE | Q1, IOA-1 |
| Command and Control | T1105 · Ingress Tool Transfer (potential follow-on) | Ruby worker launches curl/wget or connects outbound | Q2, Q3 |
| Command and Control | T1571 · Non-Standard Port (potential follow-on) | Unexpected Ruby-worker remote/listening port | Q3, Q4 |
The Rails and JPCERT sources describe the vulnerability and impact; ATT&CK technique assignments are explicitly analyst mappings, not source attribution.
Native Audit-Log Hunts
- Preserve first: export Rails/proxy request logs, Active Storage tables, object-store version/lifecycle metadata, and relevant cloud/database audit logs before cleanup jobs run.
- Exposure window: inventory Active Storage/Rails, libvips, and ruby-vips versions and identify when
:vips, direct uploads, and variant tracking were enabled. - Candidate objects: prioritize unattached blobs with variant records, then read only their first 128 bytes and test the contradictory MAT header fields documented by Rails.
- Successful-read proof: preserve the source blob, variant-record row, attached variant image, timestamps, checksums, and object metadata. Recover the target path and returned bytes from the artifacts.
- Request-log correlation: join candidate checksums/byte sizes to direct-upload requests; correlate subsequent representation GETs and any signed-ID attach/destroy/update paths.
- Secret-use audit: search cloud, database, Rails session, object-store, and third-party logs for use of process-readable credentials during and after the exposure window.
Limit: a clean scan is strong evidence, not proof. Unattached-blob cleanup, object lifecycle rules, missing variant tracking, attach-then-purge behavior, and short log retention bound conclusions.
CrowdStrike LogScale CQL Hunt Queries
Set the Falcon time picker to the full exposure window where retention permits. These queries identify endpoint-visible follow-on activity; they do not detect the in-process file-read primitive.
Looks for: Ruby, Puma, Passenger, Unicorn, or Sidekiq starting a Unix shell. FP: maintenance hooks, health checks, deployment tooling, and legitimate worker jobs that invoke shells.
// HUNT: KindaRails2Shell - Rails Worker Spawns Unix Shell // MITRE: T1059.004 // CONF: medium // FP: medium // COST: low // REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 on Linux Rails hosts // FALSE POSITIVES: deployment hooks, maintenance jobs, health checks, legitimate shell-backed worker tasks // TUNING: exclude approved parent paths, service accounts, and exact command lines only after baselining #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(ruby|puma|passenger|unicorn|sidekiq)$/i | FileName=/^(sh|bash|dash|zsh|ksh)$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, TargetProcessId_decimal])
Looks for: web/worker parents starting downloaders, network utilities, or secondary interpreters. FP: image-processing wrappers, monitoring scripts, package jobs, and application features that intentionally fetch remote content.
// HUNT: KindaRails2Shell - Rails Worker Launches Download or Scripting Tool // MITRE: T1105, T1059 // CONF: medium // FP: medium // COST: low // REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 on Linux Rails hosts // FALSE POSITIVES: approved remote-content fetchers, package tasks, monitoring scripts, media-processing wrappers // TUNING: exclude documented application jobs by full parent path and known command-line pattern #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(ruby|puma|passenger|unicorn|sidekiq)$/i | FileName=/^(curl|wget|nc|ncat|socat|python|python3|perl|php|node)$/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine, SHA256HashData])
Looks for: Ruby/Rails processes connecting to ports often used for remote administration, alternate web services, or ad hoc shells. FP: databases, cache services, internal APIs, SSH automation, and application-specific backends.
// HUNT: KindaRails2Shell - Rails Worker Connects to Uncommon Remote Port // MITRE: T1571, T1105 // CONF: medium // FP: medium // COST: low // REQUIRES: NetworkConnectIP4 on Linux Rails hosts // FALSE POSITIVES: SSH automation, database/cache backends, internal APIs, application-specific service ports // TUNING: replace the port list with ports outside the approved Rails egress baseline and allowlist known destinations #event_simpleName=NetworkConnectIP4 | ContextBaseFileName=/^(ruby|puma|passenger|unicorn|sidekiq)$/i | RemotePort=/^(22|23|2222|4444|5555|6666|7777|8080|8888|9001)$/ | table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, LocalAddressIP4, LocalPort, Protocol_decimal])
Looks for: Ruby/Rails or shell processes opening listeners outside common web ports. FP: application servers, metrics endpoints, development consoles, container health services, and debug tooling.
// HUNT: KindaRails2Shell - Unexpected Listener from Rails or Shell Process // MITRE: T1571 // CONF: medium // FP: medium // COST: low // REQUIRES: NetworkListenIP4 on Linux Rails hosts // FALSE POSITIVES: Puma/Passenger listeners, metrics exporters, development consoles, container health endpoints // TUNING: allowlist approved local ports and exact service paths for each production Rails role #event_simpleName=NetworkListenIP4 | ContextBaseFileName=/^(ruby|puma|passenger|unicorn|sidekiq|sh|bash|dash|zsh|nc|ncat|socat)$/i | LocalPort!=80 | LocalPort!=443 | LocalPort!=3000 | LocalPort!=9292 | table([@timestamp, aid, ComputerName, ContextBaseFileName, LocalAddressIP4, LocalPort, Protocol_decimal])
Looks for: Ruby-parented shell, scripting, or file utilities whose command lines reference Rails, SSH, cloud, or database secret material. FP: deployment, backup, configuration-management, and secret-rotation jobs.
// HUNT: KindaRails2Shell - Rails-Spawned Process References Secret Material // MITRE: T1552.001, T1059.004 // CONF: medium // FP: medium // COST: medium // REQUIRES: ProcessRollup2 or SyntheticProcessRollup2 on Linux Rails hosts // FALSE POSITIVES: deployment, backup, configuration-management, credential-rotation, and break-glass procedures // TUNING: exclude signed and scheduled maintenance jobs by service account, parent path, and exact command line #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(ruby|puma|passenger|unicorn|sidekiq)$/i | FileName=/^(sh|bash|dash|zsh|cat|head|tail|sed|awk|grep|env|printenv|python|python3|perl)$/i | CommandLine=/(RAILS_MASTER_KEY|secret_key_base|credentials\.yml\.enc|master\.key|DATABASE_URL|authorized_keys|id_rsa|AWS_SECRET_ACCESS_KEY)/i | table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, FileName, ImageFileName, CommandLine])
CrowdStrike Custom IOA Recommendations
IOA-1 · Web Application Worker Spawns Unix Shell
| Rule group / type | Linux Web Application Defense / Process Creation |
|---|---|
| Action / severity | DETECT FIRST · High |
| Parent image pattern | .*\/(ruby|puma|passenger|unicorn|sidekiq)$ |
| Image pattern | .*\/(sh|bash|dash|zsh|ksh)$ |
| MITRE | T1059.004 · Unix Shell |
| Exclusions | Approved deploy/health jobs by exact parent path, service account, and command-line pattern; never exclude all Ruby processes globally. |
| Promotion | Canary Linux Rails group for at least 14 days; classify every hit; consider Block only when measured FP rate is below 5% and rollback/change approval exists. |
Scheduled search and alert package
Name: HUNT: Web Application Worker - Unix Shell Child
Description: Detects Ruby/Rails application workers that create Unix shells, a high-value post-exploitation behavior following a server-side application compromise. MITRE: T1059.004. Priority: HIGH when unexpected on a production web role. FP sources: deployment hooks, health checks, shell-backed worker tasks.
Subject: 🚨 HUNT ALERT 🚨 — Web Application Worker Spawned a Unix Shell (Possible RCE)
Body: A Ruby or Rails-associated worker created a Unix shell. Confirm the parent path and command line, then compare the event with deployment and scheduled-job records. If the shell is not an approved application behavior, preserve the process tree and network evidence, isolate the host, and begin the KindaRails2Shell native forensic workflow; this event is post-exploitation evidence, not proof of the initial file-read primitive.
Investigation checklist
- Confirm
#event_simpleName,ComputerName,UserName, and the event timestamp. - Validate
ParentBaseFileNameand full parent/child paths against the deployed Rails runtime. - Inspect
CommandLinefor remote commands, secret references, downloaders, or encoded content. - Pivot on
aidandTargetProcessId_decimalto child processes and contemporaneous network events. - Compare with deployment, backup, health-check, and batch-job schedules; document the exact benign owner if known.
- Search Q2–Q5 across the same host and environment; check proxy/Rails logs for direct-upload and representation activity.
- Isolate and escalate if the shell is unexplained, contacts an unknown destination, reads secrets, or launches follow-on tooling.
Machine-Readable IOC Appendix
No atomic indicators were published. The CSV below intentionally contains labelled replacement values and must not be imported until confirmed indicators are obtained from incident evidence or an authoritative update.
type,value,action,severity,expiration,description,tags sha256,REPLACE_WITH_CONFIRMED_SHA256,no_action,medium,2026-09-08,KindaRails2Shell incident-derived artifact,campaign:KindaRails2Shell domain,REPLACE_WITH_CONFIRMED_DOMAIN,no_action,medium,2026-09-08,KindaRails2Shell incident-derived destination,campaign:KindaRails2Shell
Direct upload: POST /rails/active_storage/direct_uploads Representation: GET /rails/active_storage/representations/redirect/ Header bytes 0-9: MATLAB 5.0 Header bytes 124-125: MAT 7.3 dispatch tag 0x0200 Strong success evidence: crafted unattached blob + variant record + rendered variant
Fixed Active Storage: 7.2.3.2 / 8.0.5.1 / 8.1.3.1 Required libvips: >= 8.13 Workaround on libvips >= 8.13: VIPS_BLOCK_UNTRUSTED=1 Alternative on ruby-vips >= 2.2.1: Vips.block_untrusted(true) Confirm untrusted uploads, :vips processor, direct-upload exposure, and track_variants history.
[ ] Active Storage blob / attachment / variant-record rows [ ] First 128 bytes and checksums of candidate objects [ ] Rendered variant image and object metadata/version history [ ] Rails, reverse-proxy, WAF and load-balancer request logs [ ] Object-store access, lifecycle and deletion logs [ ] Cloud, database, IdP and third-party secret-use audit logs [ ] Secret rotation timeline and session invalidation evidence
Detection Validation Gates
| Gate | Pass criteria | Status / owner |
|---|---|---|
| Telemetry ready | Linux Rails hosts return process, IPv4 connect, and listener event types; app/object-store logs are retained. | TENANT TEST Platform |
| Benign baseline | Seven to fourteen days of Ruby-worker child-process and port behavior reviewed; legitimate jobs documented. | REQUIRED Detection engineering |
| Positive test | In an isolated canary, a benign Ruby parent starts a shell/tool and Q1/Q2 return the expected fields. Do not use exploit code. | REQUIRED Detection engineering |
| Native forensic gate | Official Rails exposure and exploitation procedures completed with evidence/limits recorded. | CRITICAL IR + application owner |
| Promotion gate | IOA Detect mode for at least 14 days, measured FP below 5%, canary test and rollback approved. | HOLD SOC/change control |
Pack build validation on 2026-08-08: structure/date/escaping, field lint, syntax lint, IOC provenance, and duplicate re-check are required to pass before dry-run release.
Hardening — Tiered & Deployable
- Upgrade Active Storage to 7.2.3.2, 8.0.5.1, 8.1.3.1 or later, and libvips to 8.13 or later. Basis: Rails GHSA; MITRE M1051 (Update Software).
- Enable untrusted-operation blocking with
VIPS_BLOCK_UNTRUSTED=1on libvips 8.13+ orVips.block_untrusted(true)on ruby-vips 2.2.1+ until the fixed release is deployed. Basis: Rails GHSA; M1038 (Execution Prevention). - Preserve evidence and rotate secrets readable by the Rails process:
secret_key_base, master key/credentials, storage, database, and third-party credentials. Do not retain an exposed key as a fallback. Basis: Rails GHSA/JPCERT; M1022, M1041. - Run official native forensics and document evidence limits before cleanup jobs or lifecycle policies remove artifacts. Basis: Rails investigation guide; MITRE M1047 (Audit).
- Require application-specific authorization and rate limits for direct uploads; disable the route where it is not needed. Basis: M1031/M1037 and vendor guidance. Pilot against all upload clients.
- Run image transformation under a dedicated low-privilege account with no unnecessary secret files, cloud metadata access, database credentials, or outbound network path. Basis: M1018, M1022, M1030; NIST SP 800-53 Access Control and System and Communications Protection families.
- Enable object-store versioning/access logs where supported and align Active Storage/database/request-log retention to the investigation window. Basis: M1047; NIST SP 800-53 Audit and Accountability family.
- Separate image processing into an isolated service/container with a minimal filesystem view, resource limits, seccomp/Landlock or equivalent runtime policy, and deny-by-default egress. Basis: M1048 (Application Isolation), M1030, and NIST SP 800-53 Access Control/System and Communications Protection families.
- Adopt secret-brokered, short-lived credentials and workload identity so a Rails process cannot hold broad durable secrets. Basis: M1026, M1041; NIST SP 800-53 Identification and Authentication/Access Control families.
- Add CI inventory gates for Rails, Active Storage, ruby-vips, libvips, and linked loader libraries; alert when fixed minimums regress. Basis: M1016 and M1051.
Deployable Playbooks
Playbook A · Patch and verify the runtime
Prerequisites: application checkout, Ruby/Bundler toolchain, staging environment, database/object-store backups, and an application-specific smoke test. Reboot required: No; application/container restart required. Rollback: redeploy the prior immutable image or restore the previous lockfile only for emergency service recovery, then disable :vips/untrusted uploads until a fixed build is restored. Rolling back reintroduces the vulnerability.
# Inspect exact resolved versions bundle exec ruby -e 'require "active_storage"; puts ActiveStorage.gem_version' vips --version bundle exec ruby -e 'require "vips"; puts Vips::version_string' # Update within the application's supported Rails branch, then run its tests bundle update rails activestorage ruby-vips bundle exec ruby -e 'require "active_storage"; puts ActiveStorage.gem_version' vips --version bundle exec rake test
Verify: resolved Active Storage is fixed, libvips is 8.13 or later, the application boots, direct upload/variant tests pass, and vulnerable images are no longer deployed.
Playbook B · Enforce libvips untrusted-operation blocking
Prerequisites: libvips 8.13 or later, systemd-managed Rails service, and a staging smoke test. Reboot required: No; service restart required. Rollback: remove the drop-in and restart only after fixed Active Storage is confirmed; keep the control if rollback would restore vulnerable code.
# Replace the service name with the production Rails unit. sudo systemctl edit REPLACE_WITH_RAILS_SERVICE.service # Add this drop-in content: [Service] Environment="VIPS_BLOCK_UNTRUSTED=1" # Apply and verify sudo systemctl daemon-reload sudo systemctl restart REPLACE_WITH_RAILS_SERVICE.service sudo systemctl show REPLACE_WITH_RAILS_SERVICE.service -p Environment
Rollback: sudo systemctl revert REPLACE_WITH_RAILS_SERVICE.service, then daemon-reload and restart. The labelled service placeholder is intentional; no environment-specific unit name was assumed.
Playbook C · Isolate the Rails worker with systemd
Prerequisites: systemd service, documented application write paths, canary node, and restore access. Reboot required: No; service restart required. Rollback: revert the drop-in and restart the unit.
sudo systemctl edit REPLACE_WITH_RAILS_SERVICE.service # Pilot and tailor ReadWritePaths before production rollout. [Service] NoNewPrivileges=true PrivateTmp=true ProtectSystem=strict ProtectHome=true PrivateDevices=true RestrictSUIDSGID=true LockPersonality=true ReadWritePaths=REPLACE_WITH_REQUIRED_UPLOAD_AND_CACHE_PATHS sudo systemctl daemon-reload sudo systemctl restart REPLACE_WITH_RAILS_SERVICE.service systemctl show REPLACE_WITH_RAILS_SERVICE.service -p NoNewPrivileges -p ProtectSystem -p ProtectHome -p PrivateTmp
Rollback: sudo systemctl revert REPLACE_WITH_RAILS_SERVICE.service, daemon-reload, and restart. Pilot because strict filesystem protection can break upload, cache, socket, and log paths.
Containment Runbook
| Phase | Actions | Owner | Evidence / exit |
|---|---|---|---|
| 1 · Stabilize | Remove vulnerable instances from service or disable untrusted uploads/:vips; preserve volumes, DB snapshots, object versions and logs; do not run cleanup. | IR + SRE | Preservation manifest; traffic shifted; timestamps in UTC |
| 2 · Scope | Establish exposure window; run Rails candidate/variant analysis; correlate upload, representation and cleanup requests; review Q1–Q5 and downstream secret use. | IR + app owner | Candidate ledger; artifact hashes; coverage/retention limits |
| 3 · Contain credentials | Rotate Rails signing/master secrets, storage, database, cloud and third-party credentials; invalidate sessions and signed URLs; revoke suspect tokens. | IAM + app owner | Rotation receipts; old-key rejection; session invalidation confirmed |
| 4 · Eradicate | Deploy fixed Active Storage/libvips, block unfuzzed operations, rebuild from trusted images, remove unapproved persistence/processes, and verify dependencies. | SRE + security | Version attestations; clean image digest; smoke tests |
| 5 · Recover | Restore through canary, watch Rails/object-store/cloud audit logs and Q1–Q5, then expand traffic gradually. | SRE + SOC | Stable error/FP rates; no old-secret use; change approval |
| 6 · Lessons | Record blind spots, extend retention, isolate image processing, narrow workload identity, and schedule a re-hunt on new Rails advisories/IOCs. | Security engineering | Accepted corrective-action plan |
Detection Coverage Map
| Technique / step | Behavior | CQL | IOA / native | Coverage |
|---|---|---|---|---|
| T1190 · Initial access | Direct upload + representation request | — | Rails/proxy logs | PARTIAL |
| In-process file read | libvips/libmatio/HDF5 reads chosen file | — | DB/object-store artifacts | EDR GAP |
| T1552.001 · Secret exposure | Process-readable credentials leave via rendered variant | Q5 only for child-process access | Native artifact + downstream logs | PARTIAL |
| T1059.004 · Unix shell | Rails worker starts a shell | Q1 | IOA-1 Detect | GOOD |
| T1105 · Tool transfer | Rails worker invokes downloader / unusual connection | Q2, Q3 | Investigate-only | PARTIAL |
| T1571 · Non-standard port | Unexpected connect/listen behavior | Q3, Q4 | Investigate-only | PARTIAL |
| Cleanup blind spot | Attach then purge source/variant evidence | — | Application request logs only | GAP BEYOND RETENTION |
Coverage summary: endpoint coverage is good for Ruby-to-shell execution and partial for follow-on network/tool behavior. The exploit primitive, successful data read, and cleanup path require application/database/object-store telemetry. Validation gates: baseline all process/network hunts, run safe canary tests, and never interpret a clean Falcon result as proof of no exploitation.
Hunt Summary Ticket
TITLE: KindaRails2Shell / CVE-2026-66066 exposure and exploitation hunt SEVERITY: Critical (CVSS v4 9.5) SCOPE: Rails applications using Active Storage with :vips and untrusted uploads HYPOTHESIS: Crafted direct uploads may have triggered in-process arbitrary file reads; post-exploit Ruby child process/network behavior may remain visible in Falcon. QUERIES: Q1 Rails shell; Q2 download/script tool; Q3 uncommon remote port; Q4 listener; Q5 secret material DO FIRST: preserve evidence; patch Active Storage/libvips; run native forensic sweep; rotate process-readable secrets EXPECTED FINDINGS: crafted unattached blobs, variant records/images, correlated direct-upload and representation requests, or unexplained Ruby-worker child/network activity GAPS: in-process read invisible to EDR; cleanup/lifecycle and retention can remove evidence; no published atomic IOCs ACTIONS: isolate unexplained RCE behavior; rotate secrets; rebuild trusted runtime; document negative-result limits OWNER: IR + Application/SRE + Detection Engineering DATE: 2026-08-08 VERSION: v0.1 Draft
Changelog
References
| Tier | Source | Used for | Access date |
|---|---|---|---|
| T1 | Rails security advisory GHSA-xr9x-r78c-5hrm | Severity, versions, impact, mitigation, secret rotation | 2026-08-08 |
| T1 | JPCERT-AT-2026-0021 | Exploit-code availability, affected conditions, urgent investigation | 2026-08-08 |
| T1 | Rails: attack details | Direct-upload/representation chain and crafted MAT discriminator | 2026-08-08 |
| T1 | Rails: investigation guide | Durable artifacts, log correlation, blind spots and limits | 2026-08-08 |
| Framework | MITRE ATT&CK Enterprise Mitigations | M1016, M1022, M1030, M1038, M1041, M1047, M1048, M1051 | 2026-08-08 |
| Framework | NIST SP 800-53 Rev. 5 | Least privilege, segmentation, audit and isolation rationale | 2026-08-08 |