메뉴
HN
Hacker News • 21일 전

정부 레일즈 사이트, CVE 패치 불과 몇 시간 만에 해킹 시도

IMP
8/10
핵심 요약

2026년 7월 29일 Ruby on Rails 8 이상의 ActiveStorage에서 심각한 원격 코드 실행 취약점(CVE-2026-66066, CVSS 9.5)이 공개되자, 보안 업체 Rietta는 당일 긴급 핫픽스를 적용했습니다. 그러나 다음 날 새벽 패치 8시간 만에 이미 공격이 시도되어, 공개 예정일보다 훨씬 앞서 익스플로잇 코드가 확산됐음을 보여줍니다. 패치 즉시 신속 대응의 중요성을 보여주는 사례입니다.

번역된 본문

2026년 7월 29일 수요일 업무 시간 이후, Rietta는 Ruby on Rails 8 이상 버전의 구성 요소인 ActiveStorage에서 발견된 심각한 원격 코드 실행(RCE) 취약점의 영향을 받는 사이트 전체에 걸쳐 긴급 핫픽스 절차를 실행했습니다. 우리는 패치가 출시된 같은 날 공개된 최초의 GitHub 보안 어드바이저리를 기반으로 작업했습니다. 이 결함을 발견한 연구 팀 중 하나인 Ethiack은 이를 KindaRails2Shell(CVE-2026-66066)이라고 명명했으며, 7월 29일 당일 초기 공개 글을 올리고 다음 날인 7월 30일 전체 기술 심층 분석을 발표했습니다.

당일 업무 시간에 우리 팀이 이 취약점을 처음 검토했을 때는 심각도가 할당되지 않은 상태였고, 단지 Ruby on Rails 업데이트가 릴리스되었고 익스플로잇 세부 내용은 표준 엠바고 조건에 따라 비공개 상태였습니다. 하지만 저녁 무렵, 팀의 모니터링에서 CVSS 점수가 극도로 심각한 9.5/10까지 상승한 것을 확인했습니다. 이는 사실상 최악의 수준으로, 패치 지연이 곧 즉각적인 침해로 이어질 실존적 위험을 의미했습니다.

고객 배경

우리의 고객에는 HIPAA 적용 대상 기관과 주(州) 정부 기관이 포함되어 있으며, 이들 중 다수는 인프라 내에 Ruby on Rails 기반 커스텀 애플리케이션을 운영합니다. 이들은 데이터 유출 사고 시 상당한 규제적·평판적 손상에 직면할 수 있는 기관들로, 심각한 위협 앞에서는 일 분의 지연도 용납할 수 없습니다.

업무 시간 중 우리 팀은 공개된 세부 내용을 검토했지만 아직 심각도가 할당되지 않아, 일반 유지보수 창구에서 처리 가능한 일반 업데이트로 분류했습니다. 하지만 저녁에 이르러 팀의 지속적인 모니터링에서 CVSS가 9.5/10으로 상승한 것이 확인되었고, 우리는 핫픽스 비상사태를 선포했습니다. 이 패치들은 Rails 보안 팀이 "Active Storage 변형 처리에서의 임의 파일 읽기 및 원격 코드 실행 가능성"이라는 제목으로 취약점을 발표·공개한 바로 그날 적용되었습니다.

과정 자체는 간단했습니다. 팀은 영향을 받는 각 Rails 앱에 대해 풀 리퀘스트를 준비하고 bundle update activestorage rails 명령을 실행해 최신 패치 버전을 받아왔습니다. 그런 다음 로컬에서, 그리고 지속적 통합(CI)에서 전체 자동화 테스트 스위트를 실행했습니다. 다른 것이 망가지지 않았음을 확인하는 전체 테스트 스위트가 깨끗하게 통과한 후에만 프로덕션에 배포했습니다. 우리는 이메일로 영향을 받은 각 고객에게 조치 내용을 통보했고, 미 동부 표준시(EST) 기준 밤 11시 30분경 업무를 마쳤습니다.

정보 공개 엠바고는 이미 무의미해져 있었다

해당 어드바이저리는 기술적 공격 체인 설명을 보류하며 2026년 8월 28일 "까지" 전체 공개하겠다고 약속했습니다. 그러나 실제로 그 엠바고는 패치가 출시된 순간부터 기능적으로 무의미했으며, 이는 누군가 이를 위반해서가 아니었습니다. 수정 사항 자체, 즉 공개된 코드 diff는 애초에 엠바고 대상이 아니었고, 익스플로잇 방법에 대한 설명만 엠바고에 묶여 있었습니다.

그 설명조차 한 달을 버티지 못했습니다. Rails 프로젝트는 바로 다음 날인 7월 30일 오후 6시 25분(EST)에 기술적 세부 내용을 담은 포렌식 도구를 GitHub에 공개했습니다. Ethiack도 다음 날 아침인 7월 31일 오전 6시 56분(EDT)에 전체 기술 보고서를 발표했습니다. 두 자료 모두 원래 명시된 엠바고 날짜보다 약 4주 앞선 것이었습니다.

Rapid7의 사고 추적 자료도 그 이유를 독립적으로 확인해 줍니다. Rails가 포렌식 도구를 계획보다 앞서 공개한 것은 여러 연구자들이 이미 공격 방법을 리버스 엔지니어링하여 개념 증명(PoC) 코드를 공개했기 때문이며, 엠바고는 Rails나 최초 발견 연구자들의 의사와 무관하게 무너지고 있었습니다.

우리 고객에 대한 첫 공격은 그 모든 것보다 이릅니다. 공격은 7월 30일 오전 7시 10분 25초(EST), 즉 우리가 패치를 적용한 지 8시간 1분 후에, Rails 자체 포렌식 도구가 공개되기 11시간 이상 전, Ethiack의 보고서가 나오기 거의 하루 전에 도달했습니다. 처음에 우리는 해당 페이로드 제작자가 패치 출시 후 몇 시간 만에 독자적으로 패치를 역분석(patch-diffing)한 것으로 추정했습니다. 그러나 새로운 증거는 다른, 더 단순한 설명을 가리키고 있

원문 보기
원문 보기 (영어)
After hours on Wednesday, July 29, 2026, Rietta executed our emergency hotfix procedure across our entire client base for sites impacted by a severe remote code execution vulnerability in ActiveStorage, a component of Ruby on Rails 8 and newer. We worked off the initial GitHub Security Advisory, published the same day the patch shipped. Ethiack, one of the research teams that discovered the flaw, dubbed it KindaRails2Shell (CVE-2026-66066) in their initial disclosure post that same day, July 29th, with a full technical deep-dive following the next day on July 30th. When our team first reviewed this vulnerability during business hours on the 29th, it showed no assigned severity, just a Ruby on Rails update released, its exploitation details withheld under the standard embargo terms. By evening, though, our team saw it had climbed to an extremely severe 9.5/10 CVSS score. That is about as bad as it gets and meant that any delay in patching was an existential risk of imminent compromise. Client Background Our client base includes HIPAA-covered entities and State government agencies, many of which have Ruby on Rails-based custom applications within their infrastructure. These are entities that face significant regulatory and reputational damage in a data breach scenario, and they can brook no delay when faced with a severe threat. During business hours, our team reviewed the released details, saw no severity yet assigned, and initially triaged it as a regular update that could proceed under normal maintenance windows. By evening, our team’s ongoing monitoring showed the CVSS had climbed to 9.5/10, and we declared a hotfix emergency. These patches were applied on the same day that the vulnerability was announced and published by the Rails security team at Possible arbitrary file read and remote code execution in Active Storage variant processing . The process itself was straightforward. The team prepared pull requests for each impacted Rails app that ran the bundle update activestorage rails command, which fetched the latest patched release. The team then locally ran and let continuous integration (CI) run the full automated test suite. Only once the full test suites passed cleanly, confirming nothing else had broken, we deployed to production. We notified each impacted client of the action via e-mail and concluded our work around 11:30 PM EST. The Detail Embargo Was Already Overtaken by Events The advisory withheld the technical attack-chain narrative, promising full disclosure “no later than” August 28, 2026. In practice, that embargo was functionally meaningless from the moment the patch shipped, and not because anyone breached it. The fix itself, a public code diff, was never embargoed at all, only the explanation of how to exploit it. That explanation didn’t even hold for a month. The Rails project published forensic tooling with technical detail the very next day, July 30th at 6:25 PM EST, on GitHub . Ethiack published its full technical write-up the following morning, July 31st at 6:56 AM EDT. Both arrived roughly four weeks ahead of the originally stated embargo date on the GitHub Advisory. Rapid7’s own incident tracking independently confirms why: Rails released the forensic tooling ahead of its planned date specifically because several researchers had already reverse-engineered the attack and published proof-of-concept code, so the embargo was giving way regardless of what Rails or the original researchers preferred. The first attack against our client predates all of that. It hit at 7:10:25 AM EST on July 30th, eight hours and one minute after we applied the patch, more than eleven hours before Rails’ own forensic tooling went public and nearly a full day before Ethiack’s own write-up. We initially assumed whoever built that first payload had done so independently, patch-diffing the fix themselves in the hours after it shipped. New evidence points to a different, simpler explanation. A public proof-of-concept exploit was committed to GitHub at 9:47:30 PM UTC on July 29th. That’s over 5 hours before our own patch was even fully deployed (11:09 PM EDT / 3:09 AM UTC on July 30th), and 13 hours, 22 minutes, and 55 seconds before the first attack attempt against our client. Timing alone doesn’t prove our attacker used that specific PoC rather than something else, or their own tooling. André Baptista of Ethiack ( @0xacb ), one of the vulnerability’s own discoverers, pointed out a detail in a public exchange with me on X . That GitHub PoC was the first public proof-of-concept to use a malformed BMP file to trigger the exploit. The first attack attempt against our client also used a maliciously formed BMP. That’s a correlation, not proof of causation. By logical abduction, though, it’s the simplest explanation that fits the evidence we have. This probably wasn’t one especially fast or skilled attacker beating the embargo alone. It looks more like the vulnerability research ecosystem as a whole outpacing the coordinated disclosure timeline. Our own emergency patch wasn’t even finished yet when that PoC went public. The embargo strategy failed before we had any chance to close that gap. Baptista put the broader dynamic plainly: “We have been holding back technical details in multiple cases to give defenders more time, but things are happening too fast.” Baptista is one of the researchers who held back technical details on this very CVE, which gives him specific insight into this matter. Attack Attempts Started Overnight on July 30th One particular client, a State government entity, logged the initial attack attempt with a maliciously formed Windows bitmap (BMP) file on July 30, 2026, at 07:10:25 AM EST, from an IP address on the RIPE network, presenting as Chrome 131.0.0 on Windows 10. That first attempt was an isolated single hit, not the opening shot of sustained activity. The logs show nothing further against this client for several days afterward. That’s consistent with a probe sourced from the early PoC rather than the start of a broader scanning campaign. The continuous, adapting wave of probing began separately, on August 3, 2026 at 1:01:05 AM EDT, using a disguised PNG file rather than the BMP from the first attempt. From that point on, the attempts continued on a rotating set of IP addresses around the world, using a variety of user agents, including a malformed spoof of Anthropic’s Claude-SearchBot crawler and an unusually candid user agent, Mozilla/5.0 (CVE-2026-66066 security verification) , that openly named the CVE it was probing for rather than attempting to disguise itself, again from an international IP address range. While our State government client does employ security assessment services, none of these attempts, the isolated July 30th probe or the sustained campaign that began August 3rd, are attributable to those activities. This was clearly unauthorized and, from August 3rd onward, continual probing of this high-severity vulnerability. Attack Attempts and Probing Continued throughout August, 2026 The attempts to exploit this behavior continued throughout the month on a daily basis, often during overnight hours. We have log evidence of attack frameworks not only automating but some indication of adaptation, such as when certain additional security measures were put into place the attempts changed to follow different variants. The extent this was all automated or the motivation of the attackers, we are not commenting on publicly at this time. Timeline Recapped Timeline of CVE-2026-66066 disclosure, patching, and exploitation attempts Date & Time Event July 21, 2026 Initial discovery by legitimate security researchers July 22, 2026 Researchers get in touch with appropriate Ruby on Rails maintainers following a responsible disclosure procedure July 29, 2026 Critical ActiveStorage update released. Disclosure and public vulnerabi