'발견하는 것'과 '수정하는 것' 사이
PHP2Shell에서 배우는 AI 시대의 취약점 대응
조사 기준일: 2026년 10월 29일
1. 문제에 발견했다면, 바로 수정할 수 있을까
'예전부터 알고 있던 문제라면, 그때 고치지 못한 걸까.' 취약점 발표를 읽으며 이런 생각을 할 때가 있다. 수정이 필요한 사용자 입장에서는 자연스러운 의문일 것이다.
반면, 수정을 전달하는 측에는 여러 가지 판단이 존재한다. 무엇이 발생하는지 확인하고, 어떤 방식으로 고칠지 선택하며, 변경으로 인해 다른 문제가 생기지는 않을지 조사해야 한다. 많은 환경에서 사용되는 소프트웨어의 경우, 업데이트를 배포할 준비 과정도 필수적이다.
2026년 10월 21일에 수정 버전이 공개된 PHP2Shell은 이 과정을 생각하게 하는 사례가 되었다. 대상은 PHP 본체의 메모리 관리와 내부 상태 처리였으며, 조건에 따라 인증 전 원격 코드 실행 등으로 이어질 수 있는 문제였다. (PHP 공식 발표)
이 경위를 통해 생각해 볼 것은, 발견을 수정으로 연결하기 위해 무엇이 필요한가이다. AI가 조사를 돕는 시대에는, 미해결 문제를 재검토하는 판단에도 변화가 요구된다.
2. 2024년 시점에서, 무엇이 보였던 것일까
PHP Foundation에 따르면, 2024년 외부 감사를 통해 보고된 문제에 대응하는 과정에서 PHP 개발자들이 OOM, 즉 메모리 부족 관련 문제의 조짐을 발견했다. 악용 가능성은 고려되었으나 구체적인 공격 경로는 확인되지 않았고, 영향이 명확한 다른 문제 대응이 우선되었다. (PHP Foundation)
여기에는 판단을 어렵게 하는 차이가 있다. '내부 처리 과정에 문제가 있다'는 것을 알아도, 외부 입력으로부터 그곳에 도달할 수 있는지, 실제로 어디까지 영향을 미치는지 여부는 더 조사해야만 알 수 있다. 미확인 부분이 크다면, 수정에 얼마나 많은 인력과 시간을 할애해야 할지 결정하기 어려워진다.
2026년 Calif의 조사에서는 7월 30일 감사 시작 후, 8월 11일에 첫 문제를 보고하고, 14일에 원격 코드 실행 실증 코드를 공유했으며, 15일에 PHP 측이 그 동작을 확인했다. 문제의 영향을 재현할 수 있는 형태로 보여주는 단계로 진전되었다. (Calif 조사 기록)
[2024년에 문제 조짐 인식 → 2026년 8월에 Calif 실증 및 PHP 측 확인 → 10월 21일에 수정 버전 공개 과정.]
그림 1: 주요 분기점. PHP Foundation, Calif, PHP 공식 발표를 기반으로 작성.
이 차이점을 고려할 때, 2024년에 이번 영향 전체가 모두 파악되었었다고 읽기는 어렵다. 다만, 영향을 실증하지 못한 문제에도 재조사할 여지는 남아있다. '지금은 확인되지 않았다'는 기록에는 다음에 확인할 기회가 필요하다.
3. 수정안이 있어도 결정하기 어려웠던 이유
PHP 측에서는 여러 개의 수정안을 검토했다. 그러나 각각의 안에는 호환성 파괴, 새로운 서비스 중단 가능성, 다수의 외부 확장 기능 변경이라는 난점이 있었다. 합의 형성 및 전문 지식을 가진 인력 부족까지 겹치면서 작업은 정체와 재개를 반복했다. Foundation 자체도 이 지연을 의사결정 및 자원 부족에 기인한 구조적 실패로 인정하고 있다. (PHP Foundation)
호환성 문제를 사용자의 입장에서 생각해 보자. 수정 후에, 이전에는 작동하던 확장 기능이 사용할 수 없게 되면 서비스 측에도 변경과 검증이 필요하게 된다. 대응하는 사람이나 업데이트 시기가 다른 다수의 사용자에게 한 번에 변경을 요구하는 것은 어렵다. 수정 코드를 준비할 수 있어도, 적용 가능한 환경을 늘리는 작업이 남아있다.
또한, 에러가 발생했을 때 처리를 종료시키면, 그 처리를 기다리던 사용자에게 실패가 반환된다. 종료를 피하는 것이 좋다고 단정할 수도 없으며, 부적절한 상태로 계속 처리할 위험과의 비교가 필요하다. 여기서 묻는 것은 어느 정도까지 동작을 지속할 수 있는지와, 어떤 시점에서 멈춰야 하는지에 대한 판단이다.
이러한 선택에 결점 없는 안이 발견된다고 할 수는 없다. 따라서 필요한 것은 각 안에서 무엇을 지키고, 무엇에 대응을 요구하는지를 명확히 하는 것이다. 기술적으로 어렵다는 설명에서 검증해야 할 항목, 필요한 협력, 판단을 내릴 담당자로 구체화해 나갈 필요가 있다.
물론, 빨리 변경했더라면 안전했을 것이라고 결과만으로 단정할 수는 없다. 당시의 수정에도 위험이 있었다. 그 사정을 이해한 위에서, 논의가 멈췄을 때 어떻게 진행할지 생각하는 것이 이 경위로부터 얻을 수 있는 배움이다.
4. 이후 조사에서 AI는 무엇을 밝히는 데 도움을 주었나
기술 내부를 하나의 예시로 살펴보겠습니다. PHP 내부에는 데이터를 생성할 때, 내용 준비가 완료되기 전에 관리상의 카운트를 증가시키는 처리가 있었습니다. 이 도중에 메모리 부족(memory shortage)이 발생하면, 후속 준비 과정이 건너뛰어집니다. 종료 처리(cleanup process)는 증가한 카운트를 기반으로 정리하려고 시도하면서 미완성 데이터까지 다루게 됩니다. Calif는 AI를 이용한 코드 조사에서 이러한 순서 문제(ordering issue)를 발견했다고 설명합니다. (Calif의 기술 해설)
문제는 메모리가 부족해지는 것 외에도, 실패 후 처리가 중간 상태를 어떻게 처리하느냐에 있었습니다. PHP 공식 문서는 이러한 종류의 불완전한 내부 데이터 사용이 메모리 손상(memory corruption)이나 원격 코드 실행(remote code execution)으로 이어질 수 있다고 설명합니다. Apache의 mod_php에서는 애플리케이션 코드가 작동하기 전의 입력 처리부터 도달하는 경로도 확인되었습니다. (PHP의 OOM 권고)
Calif는 더 나아가, 발견된 순서 문제를 일반화하여 AI에게 조사하게 하고 유사한 문제들을 탐색했습니다. 한편, 조사의 방향을 결정하는 데 있어서 연구자가 가지고 있던 PHP 과거 취약점 관련 지식이 도움이 되었다고 합니다. (Calif의 연구 방법)
Wiz의 설명에 따르면, AI는 서로 다른 PHP 버전이나 설정에 맞춘 검증, 실패 분석, 조정의 반복 작업도 지원했습니다. 특정 환경에서 작동한 실증을 다른 환경에서도 확인할 것이라면 메모리 배치(memory allocation) 등의 차이를 추적해야 하는데, 그 작업을 도왔다고 합니다. (Wiz Research)
![연구자의 지식으로 질문을 세우고, AI의 지원으로 코드 조사를 진행하며, 개발/유지보수 팀의 판단과 검증을 거쳐 수정 사항을 전달하는 개념도. 검증 결과는 질문이나 수정안 재검토로 이어질 수 있다.]
그림 2: 연구자의 지식과 AI의 조사 지원을 중심으로, 수정까지의 관계를 정리한 개념도. Calif, Wiz, PHP Foundation을 기반으로 작성됨.
여기서 읽어낼 수 있는 변화는, 의심스러운 부분을 찾는 것 외에도, 거기서 실제 피해로 이어지는 경로를 추적하는 작업이 쉬워졌다는 점입니다. 연구자가 세운 질문을 AI의 지원을 통해 구체적인 검증으로 연결했다는 점에 주목할 필요가 있습니다.
운영 측면에서의 시사점은, 과거 조사에서 도달하지 못했던 결론이라도 앞으로도 도달할 수 없다고 단정할 수는 없다는 것입니다. 코드가 같더라도, 조사하는 수단이나 활용 가능한 지식은 달라집니다. 미해결 문제를 재검토해야 하는 이유는 소프트웨어 자체의 변경 외에도 존재합니다.
5. 최종적으로 무엇을 바꾸고 수정했는가
앞선 예시에서는 데이터 생성 도중에 갑자기 빠져나와 종료 처리로 넘어가 버리는 것이 문제였습니다. OOM(Out-of-Memory) 수정에서는 이 정지 방식을 재검토했습니다. 메모리 상한에 도달했을 때는 다음 안전한 실행 지점에서 멈추는 soft OOM으로 전환됩니다. 더 높은 임계치까지 소모가 진행된 경우에는 hard OOM으로 프로세스를 즉시 종료합니다. (PHP의 OOM 권고)
이 변경의 목적은 불완전한 상태를 종료 처리가 다루지 않도록 하는 것입니다. 메모리 부족 자체는 발생할 수 있고, 프로세스가 종료되면 처리 중인 요청은 실패합니다. 수정 후에도 입력 제한이나 용량 관리는 필요하게 됩니다. (PHP의 OOM 권고)
또 다른 문제에서는 이전 요청의 메모리를 해제해도, 그것을 가리키는 정보가 워커(worker), 즉 요청을 처리하는 프로세스에 남아 있었습니다. 같은 워커가 다음 요청을 받아 일반 초기화보다 먼저 그 정보를 사용하면, 이미 해제된 메모리에 접근하게 됩니다. 여기에는 다음에 넘겨져서는 안 되는 내부 상태를 리셋하는 수정이 적용되었습니다. (PHP의 내부 상태 관련 권고)
![원인과 수정 대응. OOM으로 생성 중인 데이터가 사용되는 문제에는 안전한 지점에서의 정지와 높은 임계치에서의 즉시 종료, 해제된 메모리에 대한 참조가 남는 문제에는 내부 상태 리셋으로 대응한다.]
그림 3: OOM 권고와 내부 상태 권고를 기반으로 작성됨. 상태 잔존은 OOM 외의 오류 등에서도 발생할 수 있으므로, 양쪽에 대한 대응이 필요하다.
10월 21일 수정 사항은 PHP 8.2.35, 8.3.36, 8.4.27, 8.5.12로 공개되었습니다. 배포 사업자에게도 사전에 패치가 제공되었으며, 이용자는 자신의 배포처에서 업데이트 확인이 필요합니다. (PHP 공식 발표)
덧붙여, 10월 23일에는 특정 설정과 실행 중인 설정 변경이 겹치는 경우의 세션 처리에 대한 추가 권고가 나왔습니다. 수정 공개 후에도 검증과 안내는 계속되므로, 적용 시점에는 공식 최신 정보를 확인하는 것이 좋습니다. (PHP의 추가 권고)
6. 미해결 문제와 어떻게 관계를 맺을 것인가
이 사례를 자신들의 개발에 대입한다면, 가장 먼저 재검토하고 싶은 것은 미해결 사항 기록 방식입니다. '영향 불명', '수정이 어려움'이라고만 쓰여 있는 항목은 나중에 읽어도 다음 작업을 결정하기 어렵습니다.
자체적인 과제 관리 제안으로, 조사 중인 항목에는 "외부 입력으로부터 도달 가능한지 미확인", "수정안 A는 확장 기능과의 호환성을 검증할 필요가 있다"와 같은 구체적인 상황을 남기고 싶습니다. 여기에 담당자와 다음 재검토 날짜를 추가하면, 확인할 대상과 재개할 계기가 남게 됩니다.
우선순위를 낮추는 판단에도 재검토 조건을 추가하고 싶습니다. 새로운 실증 공개, 관련 기능 변경, 조사 방법론의 발전 등, 무엇이 발생했을 때 재평가할지 미리 결정해 둡니다. 정기적인 확인과 결합하면, 담당자가 우연히 기억하는 것에 의존하지 않아도 됩니다.
수정안 선택이 멈춘 경우에는, 필요한 검증과 검증 후에도 남는 판단을 분리하는 것이 좋습니다. 전자는 사람과 시간을 투입하고, 후자는 결정할 수 있는 사람에게 상담할 경로를 마련합니다. PHP Foundation 역시 다수결을 가능하게 하는 의사결정 변경이나, 어려운 수정을 조기에 상위 판단으로 연결하는 개선 사항에 대해 설명하고 있습니다. PHP Foundation
미루는 것이 반드시 동일한 결함 자체를 복잡하게 만들지는 않습니다. 다만, 미해결 상태인 기간은 계속됩니다. 그 사이에 새로운 공격 경로가 제시된다면, 사용자 안내나 업데이트 조정을 더욱 절박한 상황에서 진행해야 할 수도 있습니다. 대응 여유를 유지하기 위해서라도, 수정에 필요한 준비를 조금씩 진행할 의미가 있습니다.
AI를 도입할 때도, 발견할 수 있는 문제의 수와 함께 그 이후의 작업까지 고려하고 싶습니다. 누가 보고서를 확인하고, 누가 변경 사항을 검토하며, 어떤 환경에서 검증할 것인지 말입니다. 발견이 늘어나더라도, 거기에 인력이나 시간을 투입하지 못하면 미해결 항목만 증가하게 될 수도 있습니다.
문제를 발견하는 능력이 높아질수록, 그 발견을 안전한 수정으로 연결하는 판단과 체제 역시 중요해집니다.
PHP2Shell의 경과를 읽은 후에는, 저희 과제 목록에 있는 '조사 중' 항목에 대해 무엇을 알아야 다음 단계로 진행할 수 있을지 확인해 보고 싶습니다.
참고 자료
토론