2026년 10월 하순, 전 세계 소프트웨어 개발자들에게는 바쁜 한 주였습니다. 10월 20일과 21일 이틀 사이에, 수많은 웹사이트와 앱의 기반인 PHP, Node.js, Java가 한꺼번에 보안 취약점 수정판을 내놓았습니다. 그중에는 로그인하지 않은 공격자가 서버에서 코드를 실행할 수 있는 취약점도 있었습니다.

이 소식을 보고 «우리 아이가 쓰는 앱은 괜찮을까» 걱정되셨다면, 결론부터 말씀드리겠습니다. Dino Kids 서버는 수정판이 공개된 2026년 10월 21일 저녁에 이미 수정된 PHP로 돌아가고 있었습니다. 아이의 iPad, iPhone, Android 휴대폰에서 돌아가는 앱은 이 세 가지 기술을 쓰지 않습니다. 아래에서 실제로 운영 중인 시스템에서 확인한 숫자와 함께 하나씩 설명드립니다.
무슨 일이 있었나
- PHP. 10월 21일, PHP 개발팀은 8.5.12, 8.4.27, 8.3.36, 8.2.35를 내놓아 두 가지 취약점 CVE-2026-109618과 CVE-2026-109619를 고쳤습니다. 보안 업계에서는 이를 «php2shell»이라고 부릅니다. 둘 다 CVSS 4.0 기준 9.2점(긴급)으로, 계정이 없는 공격자도 서버가 자기 코드를 실행하게 만들 수 있습니다. 예정된 공개일보다 먼저 세부 내용이 SNS에 퍼져 PHP는 긴급 배포를 했고, 같은 날 실제 공격이 관측되었습니다. 10월 26일에는 미국 사이버보안·인프라보안청(CISA)이 «악용이 확인된 취약점» 목록에 올렸습니다. PHP는 설정 변경만으로는 완전히 막을 수 없다고 밝혔습니다. 방법은 업데이트뿐입니다.
- Node.js. 같은 10월 21일, Node.js는 22, 24, 26 세 버전 계열에서 취약점 10건(심각도 «높음» 4건)을 고쳤습니다. 가장 심각한 CVE-2026-111497은 손상된 Brotli 압축 데이터로 원격 코드 실행이 일어날 수 있는 문제입니다. 지원이 끝난 Node.js 20 이하는 수정판이 없습니다.
- Java. 10월 20일, Oracle은 분기별 패치로 Java SE 취약점 55건을 고쳤습니다. 하루 뒤에는 긴급 패치 CVE-2026-91403(9.1점)이 나왔습니다. 개인 키가 유출된 인도의 인증 기관 eMudhra의 인증서를 Java가 계속 신뢰할 수 있었던 문제입니다.
세 플랫폼이 동시에 패치를 낸 것은 우연이지만, 결과는 같습니다. 업데이트가 늦은 시스템은 거의 곧바로 공격자의 탐색 대상이 됩니다.
Dino Kids는 무엇으로 만들어졌나
영향을 받는지는 무엇으로 만들어졌는지에 달려 있습니다. Dino Kids는 세 부분으로 이루어져 있습니다.
- iPad, iPhone, Android 앱은 Flutter(Dart 언어)로 만들었습니다. PHP, Node.js, Java SE가 들어 있지 않으므로 이번 수정의 대상이 아닙니다.
- 서버는 계정 동기화, 색칠 그림, 음성을 맡고 있으며 PHP 8.5와 Laravel로 돌아갑니다. 이 부분은 php2shell의 대상입니다.
- 웹사이트 dino-kids.digidinos.com은 미리 만들어 둔 정적 페이지입니다. 페이지를 보여 주는 데 Node.js도 Java도 쓰지 않으므로 대상이 아닙니다.
급하게 손봐야 했던 곳은 서버뿐이었습니다.
서버는 언제 패치되었나
«업데이트했습니다» 한마디로 끝내고 싶지 않습니다. 2026년 10월 29일, 앱에 서비스를 제공하는 서버에서 확인한 내용입니다.
- PHP 8.5.12는 2026년 10월 21일 23시 04분(베트남 시간, 한국 시간 22일 1시 04분)에 설치되었고, 앱을 처리하는 PHP 프로세스도 바로 뒤인 23시 05분에 다시 시작되었습니다. 수정판이 디스크에만 있는 것이 아니라 실제로 돌아가고 있습니다. PHP가 수정판을 공개한 바로 그날입니다.
- 앱에 서비스를 제공하는 Node.js나 Java 프로세스는 없습니다. Dino Kids 서버는 PHP만으로 돌아가며, 관리 화면도 Node.js로 빌드하지 않는 손으로 쓴 파일입니다.
- Dino Kids의 HTTPS 인증서는 Google Trust Services가 발급했으며, eMudhra와는 관계가 없습니다.
- 10월 29일에는 서버 앞단의 경로도 다시 점검하고, 중계 서버의 HTTPS 암호화 라이브러리를 최신 버전으로 업데이트했습니다.
- 모든 소스 코드 변경은 자동 테스트를 통과해야 서버에 반영됩니다. PHP 8.5.12 같은 업데이트를 몇 시간 안에 넣어도 기능이 깨지지 않은 것은, 테스트를 이미 같은 PHP 8.5 계열에서 돌리고 있었기 때문입니다.
어떻게 이렇게 빨리 대응할 수 있었나
특별한 비결은 없습니다. 세 가지 습관이 있을 뿐입니다.
- 최신 계열을 계속 쓴다. Dino Kids 서버는 지원 중인 최신 계열인 PHP 8.5와 Laravel 13으로 돌아갑니다. 오래된 버전일수록 취약점이 나왔을 때 버려지기 쉽습니다. 이번에도 PHP 8.1 이하와 Node.js 20 이하는 공식 수정판이 없었습니다.
- 수정판을 빨리 내주는 저장소에서 설치한다. 서버의 PHP 패키지는 PHP 공식 릴리스를 바로 따라가는 저장소에서 받기 때문에, 많은 운영 체제의 기본 저장소처럼 며칠을 기다리지 않고 당일에 수정판을 받을 수 있었습니다.
- 돌아가는 부품을 줄인다. 앱 안에는 서버나 인터프리터가 들어 있지 않습니다. 웹사이트는 정적 페이지입니다. 돌아가는 부품이 적을수록 고칠 곳도 적습니다.
부모님이 하실 일이 있나요
거의 없습니다. 더 안심하고 싶으시다면 두 가지만 해 주세요.
- 기기의 운영 체제(iPadOS, iOS, Android)를 최신으로 유지하세요. 인증서 관련 변경을 포함해 보안 수정의 대부분은 Apple과 Google의 업데이트로 전달됩니다.
- App Store나 Google Play에 새 버전이 나오면 Dino Kids를 업데이트하세요.
이번 일로 비밀번호를 바꾸실 필요는 없습니다. 다시 한번 말씀드리면, Dino Kids는 계정 없이도 모든 기능을 쓸 수 있고, 앱에는 제3자의 광고나 추적 도구가 전혀 없습니다. 서버에 무엇을 왜 보내는지는 개인정보 처리방침에 적어 두었습니다.
솔직하게 말씀드리면
완벽하게 안전한 시스템은 없고, 저희도 그렇게 약속하지 않습니다. 약속드릴 수 있는 것은 Dino Kids가 의존하는 소프트웨어의 보안 공지를 계속 살피고, 수정판이 나오면 바로 적용하고, 문제가 생기면 솔직하게 알려 드리는 것입니다. 이상한 점을 발견하셨거나 취약점을 제보하고 싶은 보안 연구자분은 dinokids@digidinos.com으로 연락해 주세요.
참고 자료
- PHP, PHP 8 ChangeLog (8.5.12 항목).
- watchTowr, CVE-2026-109618: Exploited Remote Code Execution in PHP.
- Node.js, Wednesday, October 21, 2026 Security Releases.
- Oracle, Critical Patch Update Advisory - October 2026.