KindaRails2Shell / CVE-2026-66066

Active Storage + libvips arbitrary file read with credential exposure and RCE potential
Threat
Public exploit path
Severity
CRITICAL · 9.5
Type
CVE / web application
Access
Network · no privileges
Version
v0.1 · 2026-08-08
Author
HuntPack
Intel Confidence
HIGH
01

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.

Defender priority: patch Active Storage and libvips, preserve logs/object-store evidence, run the Rails forensic sweep, and rotate every process-readable secret. A clean EDR hunt does not rule out in-process file disclosure.
02

Source Review & Web Hunter Notes

TierSource / dateKey findingCarry forward
T1Rails GHSA-xr9x-r78c-5hrm
2026-07-29
Affected/fixed versions, prerequisites, CVSS 9.5, secret-rotation and libvips requirements.Yes
T1JPCERT-AT-2026-0021
2026-07-30; updated 2026-08-03
Public exploit code observed; urges compromise investigation and credential rotation.Yes
T1Rails attack trace
2026-07-31
Direct-upload and representation chain; crafted MAT/HDF5 structure; in-process file-read path.Yes
T1Rails 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.

03

Hunt Brief & Attack Chain

Detection hypotheses

  1. H1 · High: a compromised Rails worker may spawn a shell or command utility not expected in normal image processing.
  2. H2 · Medium: a compromised Ruby/Rails process may invoke download, scripting, or networking tools for second-stage execution.
  3. H3 · Medium: a Ruby/Rails worker may connect to uncommon remote ports after secret theft or RCE.
  4. H4 · Medium: a Ruby/Rails or shell process may create an unexpected listening socket.
  5. H5 · Medium: a Ruby-spawned shell may reference Rails secrets, environment files, SSH keys, or cloud credentials.

Attack chain

StepObserved / documented behaviorTelemetryHunt angle
1Crafted blob created through the Active Storage direct-upload endpoint with attacker-declared image content type.Rails request log; Active Storage database/object storePOST path, unattached blob, crafted MAT header
2A genuine harvested variation key is combined with the crafted blob signed ID at the representation endpoint.Rails/proxy request logsRepresentation GET after direct upload
3libvips/libmatio/HDF5 reads an attacker-selected file and renders bytes into a stored variant.In-process; Active Storage variant records and object storeEDR GAP Native forensic sweep
4Process-readable secrets may be exposed, enabling session forgery, cloud/database access, lateral movement, or RCE.Identity, cloud, database, endpoint and network telemetrySecret-use anomalies; post-exploit child process/network hunts
5Optional attacker cleanup may attach then purge the source blob and derived evidence.Rails request logs and database historyDestroy/update routes accepting signed blob IDs
04

Consolidated IOC Table

TypeValueConfidenceActionContext / expiry
Atomic IOCNone publishedDo not blockNo campaign-specific hash, domain, IP, or filename was disclosed.
Behavioral artifactMAT header begins MATLAB 5.0 while bytes 124–127 encode MAT 7.3 dispatch/endian fieldsHighHuntKnown crafted-object discriminator; inspect first 128 bytes.
Database artifactUnattached crafted blob plus active_storage_variant_records rowHighInvestigateVariant record indicates transformation occurred.
Stored evidenceVariant image attached to the variant recordHighPreserveMay contain exfiltrated bytes as pixel values.
05

Affected Surface & Telemetry Matrix

SurfaceRequired condition / telemetryPriorityGap risk
Rails / Active StorageVulnerable Active Storage; untrusted uploads; :vips variant processorCriticalApplication inventory required
libvips / ruby-vipslibvips loader set and linked libraries; version/config evidenceCriticalPackage inventories may not show runtime linkage
Rails request logsDirect-upload and representation routes, source address, user agent, authenticated identityCriticalRetention may be short
Active Storage DB/object storeBlob, attachment, variant-record rows; object ranged reads; lifecycle historyCriticalCleanup/lifecycle may remove evidence
Falcon Linux endpointProcessRollup2, SyntheticProcessRollup2, NetworkConnectIP4, NetworkListenIP4HighExploit primitive is in-process
Downstream servicesCloud, DB, IdP and third-party audit logs tied to rotated credentialsHighSecret theft may be used off-host
06

ATT&CK Mapping

TacticTechniqueBehaviorQuery / control
Initial AccessT1190 · Exploit Public-Facing Application (analyst mapping)Crafted Active Storage direct upload and representation requestNative logs; M1051, M1031
Credential AccessT1552.001 · Credentials in Files (analyst mapping)Read process environment, Rails master key/credentials, cloud or DB credentialsNative forensics; Q5; M1022, M1041
ExecutionT1059.004 · Unix Shell (potential follow-on)Rails/Ruby worker spawns a shell after RCEQ1, IOA-1
Command and ControlT1105 · Ingress Tool Transfer (potential follow-on)Ruby worker launches curl/wget or connects outboundQ2, Q3
Command and ControlT1571 · Non-Standard Port (potential follow-on)Unexpected Ruby-worker remote/listening portQ3, Q4

The Rails and JPCERT sources describe the vulnerability and impact; ATT&CK technique assignments are explicitly analyst mappings, not source attribution.

07

Native Audit-Log Hunts

  1. 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.
  2. Exposure window: inventory Active Storage/Rails, libvips, and ruby-vips versions and identify when :vips, direct uploads, and variant tracking were enabled.
  3. 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.
  4. 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.
  5. Request-log correlation: join candidate checksums/byte sizes to direct-upload requests; correlate subsequent representation GETs and any signed-ID attach/destroy/update paths.
  6. 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.

08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.

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.

Q1 · Rails Worker Spawns Unix Shell
CONF MEDIUMFP MEDIUMCOST LOW

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])
Q2 · Rails Worker Launches Download or Scripting Tool
CONF MEDIUMFP MEDIUMCOST LOW

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])
Q3 · Rails Worker Connects to Uncommon Remote Port
CONF MEDIUMFP MEDIUMCOST LOW

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])
Q4 · Unexpected Listener from Rails or Shell Process
CONF MEDIUMFP MEDIUMCOST LOW

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])
Q5 · Rails-Spawned Process References Secret Material
CONF MEDIUMFP MEDIUMCOST MEDIUM

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])
09

CrowdStrike Custom IOA Recommendations

IOA-1 · Web Application Worker Spawns Unix Shell

Rule group / typeLinux Web Application Defense / Process Creation
Action / severityDETECT FIRST · High
Parent image pattern.*\/(ruby|puma|passenger|unicorn|sidekiq)$
Image pattern.*\/(sh|bash|dash|zsh|ksh)$
MITRET1059.004 · Unix Shell
ExclusionsApproved deploy/health jobs by exact parent path, service account, and command-line pattern; never exclude all Ruby processes globally.
PromotionCanary 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

  1. Confirm #event_simpleName, ComputerName, UserName, and the event timestamp.
  2. Validate ParentBaseFileName and full parent/child paths against the deployed Rails runtime.
  3. Inspect CommandLine for remote commands, secret references, downloaders, or encoded content.
  4. Pivot on aid and TargetProcessId_decimal to child processes and contemporaneous network events.
  5. Compare with deployment, backup, health-check, and batch-job schedules; document the exact benign owner if known.
  6. Search Q2–Q5 across the same host and environment; check proxy/Rails logs for direct-upload and representation activity.
  7. Isolate and escalate if the shell is unexplained, contacts an unknown destination, reads secrets, or launches follow-on tooling.
10

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.

Falcon IOC Management CSVplaceholders only
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
Behavioral Signaturessource-backed
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
Exposure Auditinventory
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.
Forensic Evidence Checklistpreserve
[ ] 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
11

Detection Validation Gates

GatePass criteriaStatus / owner
Telemetry readyLinux Rails hosts return process, IPv4 connect, and listener event types; app/object-store logs are retained.TENANT TEST Platform
Benign baselineSeven to fourteen days of Ruby-worker child-process and port behavior reviewed; legitimate jobs documented.REQUIRED Detection engineering
Positive testIn 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 gateOfficial Rails exposure and exploitation procedures completed with evidence/limits recorded.CRITICAL IR + application owner
Promotion gateIOA 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.

12

Hardening — Tiered & Deployable

Immediate · deploy this week
  • 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=1 on libvips 8.13+ or Vips.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).
Near term · 1–4 weeks
  • 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.
Strategic · 1–3 months
  • 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.
13

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.

14

Containment Runbook

PhaseActionsOwnerEvidence / exit
1 · StabilizeRemove vulnerable instances from service or disable untrusted uploads/:vips; preserve volumes, DB snapshots, object versions and logs; do not run cleanup.IR + SREPreservation manifest; traffic shifted; timestamps in UTC
2 · ScopeEstablish exposure window; run Rails candidate/variant analysis; correlate upload, representation and cleanup requests; review Q1–Q5 and downstream secret use.IR + app ownerCandidate ledger; artifact hashes; coverage/retention limits
3 · Contain credentialsRotate Rails signing/master secrets, storage, database, cloud and third-party credentials; invalidate sessions and signed URLs; revoke suspect tokens.IAM + app ownerRotation receipts; old-key rejection; session invalidation confirmed
4 · EradicateDeploy fixed Active Storage/libvips, block unfuzzed operations, rebuild from trusted images, remove unapproved persistence/processes, and verify dependencies.SRE + securityVersion attestations; clean image digest; smoke tests
5 · RecoverRestore through canary, watch Rails/object-store/cloud audit logs and Q1–Q5, then expand traffic gradually.SRE + SOCStable error/FP rates; no old-secret use; change approval
6 · LessonsRecord blind spots, extend retention, isolate image processing, narrow workload identity, and schedule a re-hunt on new Rails advisories/IOCs.Security engineeringAccepted corrective-action plan
15

Detection Coverage Map

Technique / stepBehaviorCQLIOA / nativeCoverage
T1190 · Initial accessDirect upload + representation requestRails/proxy logsPARTIAL
In-process file readlibvips/libmatio/HDF5 reads chosen fileDB/object-store artifactsEDR GAP
T1552.001 · Secret exposureProcess-readable credentials leave via rendered variantQ5 only for child-process accessNative artifact + downstream logsPARTIAL
T1059.004 · Unix shellRails worker starts a shellQ1IOA-1 DetectGOOD
T1105 · Tool transferRails worker invokes downloader / unusual connectionQ2, Q3Investigate-onlyPARTIAL
T1571 · Non-standard portUnexpected connect/listen behaviorQ3, Q4Investigate-onlyPARTIAL
Cleanup blind spotAttach then purge source/variant evidenceApplication request logs onlyGAP 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.

16

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
17

Changelog

v0.12026-08-08Initial research, five Falcon hunts, one Detect-first IOA, native forensic workflow, hardening, playbooks, containment, and coverage assessment.
18

References

TierSourceUsed forAccess date
T1Rails security advisory GHSA-xr9x-r78c-5hrmSeverity, versions, impact, mitigation, secret rotation2026-08-08
T1JPCERT-AT-2026-0021Exploit-code availability, affected conditions, urgent investigation2026-08-08
T1Rails: attack detailsDirect-upload/representation chain and crafted MAT discriminator2026-08-08
T1Rails: investigation guideDurable artifacts, log correlation, blind spots and limits2026-08-08
FrameworkMITRE ATT&CK Enterprise MitigationsM1016, M1022, M1030, M1038, M1041, M1047, M1048, M10512026-08-08
FrameworkNIST SP 800-53 Rev. 5Least privilege, segmentation, audit and isolation rationale2026-08-08