AI 해킹 시대 서버 보안 패치 우선순위
이 글의 순서 9개 절
요즘 보안 공지에는 「AI가 찾았다」는 말이 자주 붙는다. 당번에게 이 말은 패치 목록이 길어진다는 뜻이다. 숫자를 보면 AI가 찾은 취약점이 다 공격으로 이어지지는 않는다. 그래도 10월에는 그런 취약점 하나가 실제 공격 목록에 올랐고, 그것이 Node.js 안에 있었다.
빨라진 쪽은 공격
VulnCheck가 자체 KEV(실제 악용이 확인된 취약점) 목록으로 2026년 상반기를 세어 보니 495건이었다. CVE 공개부터 KEV 등재까지 걸린 기간의 중앙값은 2025년 120일에서 80일로 줄었다. 공개 당일이나 그 전에 이미 악용 흔적이 있던 비율은 23.43%로, 2025년 28.93%보다 조금 낮다.
AI의 도움으로 찾았다고 밝힌 취약점은 1,061건이고 그중 악용이 확인된 것은 14건(1.3%)이다. 전체 취약점의 악용 비율과 비슷하다. Anthropic의 Project Glasswing 발견 가운데 공개 CVE가 된 것은 126건이고, 악용이 확인된 것은 1건이었다.
AI가 찾았다고 더 위험하지는 않다. 다만 공개에서 악용 목록 등재까지 중앙값이 80일이다. 석 달에 한 번 몰아서 올리는 일정이라면 그 사이에 등재되는 것이 생긴다. 우선순위는 실제 악용 여부로 정한다.
올릴 버전
CISA KEV 2026-10-30판과 각 프로젝트 공지 기준이다.
| 대상 | 이 버전 이상 | 고친 것 | CISA KEV |
|---|---|---|---|
| PHP | 8.5.12, 8.4.27, 8.3.36, 8.2.35 | 원격 코드 실행 2건(PHP2Shell) | 10-26 등재 |
| Node.js | 26.12.1, 24.22.1, 22.23.4 | Brotli 디코더 원격 코드 실행, TLS 호스트명 검증 우회, DNS 이름 잘림 | Brotli 10-27 등재 |
| Python | 3.15.2, 3.14.10, 3.13.18, 3.12.16, 3.11.18 | 손상된 eMudhra 중간 CA 차단, tarfile 필터 우회 | 없음 |
| nginx | 1.30.6(stable), 1.31.7(mainline) | alias와 rewrite 버퍼 오버플로 등 5건 | 없음 |
php -v
node -v
python3 -V
nginx -v
배포판 패키지는 보안 수정을 덧대도 버전 번호가 그대로인 경우가 많다. 그때는 패키지 변경 기록에서 CVE 번호를 찾는다. 방법은 PHP2Shell 점검 글에 적었고 다른 패키지도 같다.
PHP는 마감이 이미 지났다
CVE-2026-109618과 CVE-2026-109619는 2026-10-26에 KEV에 올랐다. 미국 연방기관에 준 조치 기한은 10-29, 사흘이었다. 로그인 없이 웹 요청만으로 코드를 실행하는 취약점이다. 자세한 확인과 임시 조치는 위의 PHP2Shell 글에 있다.
그 뒤로 공지가 둘 더 나왔다. 10-23에 php.net은 다음 정기 릴리스까지 session.upload_progress.enabled=0을
걸어 두라고 했다. 가능성은 낮지만 남은 원격 코드 실행 경로가 있다는 이유다. 10-26에는 Windows용 빌드
8.5.12-1, 8.4.27-1, 8.3.36-1, 8.2.35-1을 다시 냈다. 아래 Brotli 취약점을 고친 Brotli 1.2.1이 들어갔다.
Windows PHP에서는 cURL 확장의 HTTP 응답 자동 압축 해제를 켰을 때 이 디코더에 닿는다.
Node.js에 든 Brotli 디코더
CVE-2026-111497은 Node.js에 들어 있는 Brotli 디코더의 메모리 쓰기 오류다. 잘못된 블록 전환을 형식 오류가
아니라 입력이 더 필요한 상태로 처리해서, 디코더가 8바이트짜리 내부 버퍼 뒤로 입력을 계속 이어 쓴다.
공격자가 준 Brotli 데이터를 node:zlib로 푸는 앱이면 프로세스가 죽거나, 메모리가 새거나, 원격 코드
실행까지 간다. Node.js 공지에 적힌 제보자는 OpenAI Codex Security다.
CISA는 이 취약점을 2026-10-27에 KEV에 올렸다. 제품명은 Google Brotli이고 조치 기한은 11-10이다. 해당
범위는 Brotli 1.0.3부터 1.2.0까지라 Node.js만의 문제가 아니다. 외부에서 받은 br 압축 요청 본문이나
응답을 푸는 코드가 해당한다.
Node.js는 10-21 보안 공지에서 26.12.1, 24.22.1, 22.23.4로 고쳤다. 지금 최신은 26.13.0, 24.22.2, 22.23.4다. Node.js 20은 2026-04-30에 지원이 끝나 20.20.2가 마지막 판이다. 이번 수정이 없으니 22 이상으로 옮겨야 한다.
같은 공지에 인증서 쪽 수정도 들어갔다. tls.checkServerIdentity()가 표준 형태가 아닌 IPv4 주소를 잘못
해석한 문제가 셋이다.
- CVE-2026-105483(26.x, 24.x): 전각 숫자로 쓴 IP 주소를 IP로 보지 않아, IP SAN 없이 DNS 이름에 IP를 적은 인증서가 통과했다.
- CVE-2026-106069(26.x, 24.x, 22.x):
0127.0.0.1처럼 앞자리가 0인 주소를 검증과 실제 연결이 다르게 읽어, 다른 IP용 인증서로 인증될 수 있었다. - CVE-2026-106072(medium):
0x7f.0.0.1,127.1같은 표기에서 DNS SAN만 있는 인증서가 IP 연결을 인증했다.
IP 주소로 TLS 연결을 맺는 내부 호출이 있으면 해당한다. dns.resolve*()가 NUL 문자가 든 이름을 잘라서
조회하는 문제(CVE-2026-105482)도 고쳤다. 도메인 허용 목록으로 검사한 뒤 조회하는 코드라면 검사한 이름과
다른 이름의 레코드를 받을 수 있었다. 번들 CA 목록에도 eMudhra 중간 CA 사고에 대한 조치가 들어갔다.
node -v
# 컨테이너 이미지는 이미지 안의 node를 본다
docker run --rm --entrypoint node <이미지> -v
Python은 인증서 쪽이 급하다
Python 쪽은 KEV에 오른 것이 없다. 대신 인증서 사고가 있었다. eMudhra(emSign) 중간 CA 인증서가 손상되면서
certifi 같은 CA 묶음에서 emSign 루트가 빠졌다. Python 쪽 공지는 그대로 두면 python.org와 pypi.org
연결까지 중간자 공격을 받을 수 있다고 했다.
2026-10-25에 나온 3.15.2, 3.14.10, 3.13.18, 3.12.16, 3.11.18은 ssl 모듈에 손상된 인증서 거부 목록을
넣었다(CVE-2026-115557). SSLContext 설정과 상관없이, certifi가 그 루트를 아직 들고 있어도 해당 중간
인증서를 거부한다. 3.10은 10-01에 낸 3.10.22가 마지막 판이라 이 차단이 없다.
공지가 요구한 최소 버전은 pip 26.2.2, uv 0.13.6, certifi 2026.10.19다. pip는 자기 안에 따로 CA 묶음을
들고 다니므로 OS 인증서를 고쳐도 pip는 따로 올린다. 컨테이너 이미지는 레이어 캐시 없이 다시 빌드해야 최신
시스템 인증서를 받는다. ca-certificates를 깐 레이어가 캐시에서 재사용되면 시스템 인증서는 옛것 그대로다.
python3 -V
python3 -m pip --version
uv --version
python3 -m pip show certifi Brotli brotlicffi 2>/dev/null | grep -E '^(Name|Version)'
docker build --no-cache -t <이미지> .
Brotli나 brotlicffi가 보이면 위의 Brotli 취약점도 해당한다. urllib3 같은 HTTP 라이브러리는 이 패키지가
깔려 있으면 br 응답을 푼다. 고친 버전은 Brotli 1.2.1, brotlicffi 1.2.1.0이다.
TLS 서버를 Python으로 직접 띄운다면 9월 수정도 본다. 서버 이름별로 인증서를 고르려고 sni_callback에서
SSLSocket.context를 바꾸는데 원래 SSLContext를 붙잡아 두는 곳이 없으면, 인증 없는 클라이언트가 서버를
죽이거나 해제된 포인터를 호출하게 할 수 있다(CVE-2026-19445, 3.14.8에서 고침). 올리기 전까지는
sni_callback을 단 SSLContext를 서버가 떠 있는 동안 참조로 붙잡아 두면 된다.
nginx는 KEV가 없는데 자주 나온다
nginx 보안 권고 페이지에 올해 번호가 붙은 CVE는 26건이다. stable 1.30은 1.30.1부터 1.30.6까지 여섯 번 보안 수정판이 나왔다. 실제 악용이 확인된 것은 없다. 대신 한 달에 한 번꼴로 올릴 일이 생긴다.
2026-10-14에 나온 1.30.6과 1.31.7이 고친 것은 다섯 건이다.
- CVE-2026-15176: alias와 rewrite를 쓰는 location에서
set이나return이$request_filename을 참조할 때의 버퍼 오버플로 - CVE-2026-93479: 스크립트 평가 버퍼 오버플로
- CVE-2026-95101: HTTP/3 요청 본문 주입
- CVE-2026-97629: TLS 세션 티켓을 쓸 때의 세션 위조
- CVE-2026-97205: 비동기 파일 입출력(AIO) use-after-free
nginx는 다섯 건 모두 medium으로 매겼다. CVE-2026-15176에 F5가 매긴 CVSS 4.0 점수는 9.2다. mainline은 10-21에 1.31.8까지 나왔다.
nginx -v
# 배포판 패키지는 변경 기록에서 CVE 번호를 찾는다
zgrep -c CVE-2026-15176 /usr/share/doc/nginx*/changelog.Debian.gz
rpm -q --changelog nginx | grep CVE-2026-15176 # RHEL 계열
패키지를 올린 뒤에는 재시작한다. reload는 설정만 다시 읽고 이미 떠 있는 마스터 프로세스는 옛 바이너리
그대로다. 재시작하면 열린 연결이 끊기니 트래픽이 적은 시간에 하거나 로드밸런서에서 노드를 빼고 한다.
sudo systemctl restart nginx
AI 도구 자체가 표적이다
VulnCheck는 같은 보고서에서 AI 제품이 새 공격면이 됐다고 적었다. 모델을 만드는 도구, 작업 분산 플랫폼, AI 게이트웨이, 에이전트, 워크플로 자동화에서 실제 악용이 확인됐다. CISA KEV에도 올해 이런 도구가 여럿 올랐다.
| 도구 | 기본 포트 | CISA KEV 등재 CVE |
|---|---|---|
| LiteLLM | 4000 | CVE-2026-42208, CVE-2026-42271, CVE-2026-59822 |
| Langflow | 7860 | CVE-2025-34291, CVE-2026-55255, CVE-2026-0770, CVE-2026-9198 |
| Ray 대시보드 | 8265 | CVE-2025-62593 |
| Ollama | 11434 | 없음 |
Ollama는 KEV에 없지만 0.17.1 이전 버전에 GGUF 모델 로더의 메모리 범위 밖 읽기(CVE-2026-7482)가 있다.
이런 도구는 GPU 서버에 실험용으로 띄웠다가 잊히기 쉽다. 웹 서버 패치 목록에는 없는데 인터넷에서는 보이는 서버가 된다. 어느 주소로 열려 있는지부터 본다.
sudo ss -ltnp | grep -E ':(4000|7860|8265|11434)\b'
주소가 0.0.0.0이나 *이면 모든 네트워크에 열려 있다. Ollama는 기본이 127.0.0.1인데 OLLAMA_HOST=0.0.0.0을
준 적이 있으면 바깥에서 닿는다. 밖에서 쓸 일이 없으면 127.0.0.1로 묶고, 써야 하면 인증을 거는 리버스
프록시 뒤에 둔다.
개발 PC의 설정 파일도 노린다
2026-07-11에 Socket이 공개한 npm 패키지 jscrambler 8.14.0은 설치할 때 숨은 바이너리를 실행했다. 이 악성
코드가 따로 챙긴 것이 AI 개발 도구 설정이다. Claude Desktop의 claude_desktop_config.json, Cursor의
.cursor/mcp.json, Windsurf의 mcp_config.json 같은 파일이다. 이 파일에는 API 키와 MCP 서버 자격증명이
평문으로 들어가 있는 경우가 많다.
MCP 설정에 넣은 키도 서버 키처럼 다룬다. 범위를 좁혀 발급하고, 그 PC에서 의심스러운 패키지가 돌았다면 바로 교체한다. 서버가 뚫렸을 때의 인증서 키 교체 순서는 서버가 뚫렸을 때 인증서 개인키 교체와 폐기에 적었다. 웹 앱 프레임워크 쪽은 Next.js 이미지 최적화 원격 코드 실행 점검도 10월 일이다.
참조
- VulnCheck: State of Exploitation 1H 2026
- CISA Known Exploited Vulnerabilities Catalog
- PHP: News Archive 2026
- Node.js: October 2026 Security Releases
- Python: Information for Python users regarding eMudhra / emSign CA certificate security incident
- NVD: CVE-2026-115557
- Python 3.14.10 릴리스 노트
- NVD: CVE-2026-19445
- nginx security advisories
- NVD: CVE-2026-15176
- NVD: CVE-2026-7482
- Socket: jscrambler npm Package Compromised in Supply Chain Attack