2026. 11. 3. 10:13 IT인터넷
Node.js 공격 탐지 (ModSecurity / Gemini)
/var/log/httpd/ssl_ed_error_log:[Mon Nov 02 19:35:30 2026] [error] [client 51.15.92.214] ModSecurity: Access denied with code 403 (phase 2). Pattern match "(?i:(?:(?:s(?:t(?:d(?:dev(_pop|_samp)?)?|r(?:_to_date|cmp))|u(?:b(?:str(?:ing(_index)?)?|(?:dat|tim)e)|m)|e(?:c(?:_to_time|ond)|ssion_user)|ys(?:tem_user|date)|ha(1|2)?|oundex|chema|ig?n|pace|qrt)|i(?:s(null|_(free_lock|ipv4_compat|ipv4_mapped|ipv4|ipv ..." at ARGS:0. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_41_sql_injection_attacks.conf"] [line "125"] [id "950001"] [rev "2"] [msg "SQL Injection Attack"] [data "Matched Data: sign( found within ARGS:0: {\x22then\x22: \x22$1:__proto__:then\x22, \x22status\x22: \x22resolved_model\x22, \x22reason\x22: -1, \x22value\x22: \x22{\x5c\x22then\x5c\x22: \x5c\x22$B0\x5c\x22}\x22, \x22_response\x22: {\x22_prefix\x22: \x22var reject_bridge = arguments[1]; (Promise.all([Function('return import(\x5c\x22node:child_process\x5c\x22)')(), Function('return import(\x 5c\x22node:zlib\x5c\x22)')()]).then(([cp, zlib]) => { return new Promise((resolve, reject) => { try { ..."] [severity "CRITI [hostname "ed.com"] [uri "/"] [unique_id "auhnctMglaEAADte7KYAAAAN"] /var/log/httpd/ssl_ed_error_log:[Mon Nov 02 19:35:31 2026] [error] [client 51.15.92.214] ModSecurity: Access denied with code 403 (phase 2). Match of "eq 0" against "MULTIPART_STRICT_ERROR" required. [file "/etc/httpd/modsecurity.d/activated_rules/modsecurity_crs_20_protocol_violations.conf"] [line "192"] [id "960914"] [rev "1"] [msg "Multipart request body failed strict validation: PE 0, BQ 0, BW 0, DB 1, DA 0, HF 0, LF 0, SM , IQ 0, IH 0, FLE 0"] [severity "CRITICAL"] [ver "OWASP_CRS/2.2.6"] [maturity "8"] [accuracy "7"] [tag "OWASP_CRS/PROTOCOL_VIOLATION/INVALID_REQ"] [tag "CAPEC-272"] [hostname "ed.com"] [uri "/"] [unique_id "auhnc9MglaEAAB7oNcAAAAAJ"]
- 차단 원인: ARGS:0 데이터 내에 sign(이라는 문자열이 포함되어 ModSecurity의 SQL 인젝션 탐지 규칙(id "950001")에 걸렸습니다.
- 실제 데이터 해석: WAF는 SQL 인젝션으로 판단했으나, 페이로드(_response)의 내용을 디코딩해 보면 Node.js(JavaScript) 환경을 노린 원격 코드 실행(RCE) 및 프로토타입 오염(Prototype Pollution) 공격 시도입니다.
공격자는 __proto__를 이용한 프로토타입 오염과 Node.js의 내부 모듈인 child_process를 임포트하여 서버에서 임의의 명령어를 실행하려 했습니다. 즉, SQL 인젝션 규칙에 걸린 것은 일종의 오탐(문자열 매칭)이지만, 입력값 자체가 명백한 악성 페이로드이므로 차단된 것이 안전합니다.javascript
var reject_bridge = arguments[1]; (Promise.all([ Function('return import("node:child_process")')(), Function('return import("node:zlib")')() ]).then(([cp, zlib]) => { ... })코드를 사용할 때는 주의가 필요합니다.
- 차단 원인: 멀티파트(Multipart) 요청 본문이 엄격한 유효성 검사를 통과하지 못했습니다(id "960914").
- 실제 데이터 해석: 플래그 중 DB 1이 표시되어 있습니다. 이는 데이터 본문 뒤에 불필요하거나 비정상적인 데이터가 추가로 존재(Data Befriend/Data Bytes after boundary)함을 뜻합니다. 공격 툴이나 조작된 패킷을 사용하여 요청을 보낼 때 흔히 발생하는 프로토콜 위반 형태입니다.
- 서버 환경 점검: 공격 페이로드가 Node.js 배포 환경(node:child_process 등)을 타깃으로 하고 있습니다. 만약 백엔드에서 Node.js를 사용 중이라면 백엔드 프레임워크와 의존성 패키지(npm)들이 최신 버전으로 업데이트되어 있는지 점검하세요.
- IP 차단 (선택): 동일한 IP(51.15.92.214)에서 연속적으로 악성 페이로드가 유입되었으므로, 방화벽(iptables, ufw 등)이나 클라우드 ACL을 통해 해당 IP를 일정 기간 블랙리스트에 등록하는 것이 좋습니다.
- 룰 유지: 해당 차단은 보안상 유효한 차단이므로 ModSecurity의 950001, 960914 규칙을 예외 처리(Whitelist)하지 말고 그대로 유지하십시오.
'IT인터넷' 카테고리의 다른 글
| CDN 없이 봇을 차단하는 기법 (Apache + mod_rewrite) (0) | 2026.10.28 |
|---|---|
| modsecurity request_cookies 차단되는 경우 (0) | 2025.05.21 |
| HP서버(Array P440ar)에서 RAID-1 디스크 교체 (300G -> 600G)후 온라인에서 용량을 늘릴 수 있을까요? (0) | 2025.04.08 |
| [스크랩] HPE 서버에 장착된 HDD 교체 및 용량 확장 방법 (리눅스/윈도우) (0) | 2025.04.08 |
| 시스코 스위치 기술지원 (0) | 2025.02.03 |






