\s+ 뒤에 (?! 바로 쓸때 문제

얼마전 VoIP 룰을 분석하면서

pcre의 문제점을 발견한 것이 있다.

 

일단 Snort 룰 중 VoIP 관련 룰을 하나 보자.

alert udp $EXTERNAL_NET any -> $HOME_NET 5060

(msg:”VOIP-SIP Via header missing SIP field”;

content:”Via|3A|”; nocase; pcre:”/^Via\x3A\s+(?!SIP\x2F2\x2E0)/smi”;

reference:url,www.ietf.org/rfc/rfc3261.txt; classtype:misc-activity; sid:11975; rev:2;)

  

 

우선 VoIP 헤더에서는

Via: SIP/2.0

이런 식으로 시작하는 Via 헤더가 존재한다.

Via: 다음으로 바로 SIP 버젼이 나온다.

 

현재 RFC문서에서는 2.0으로 하길 권고하고있다.

 

 

위 룰에서 pcre를 살펴보면

  pcre:”/^Via\x3A\s+(?!SIP\x2F2\x2E0)/smi”;

 

SIP버젼이 2.0이 아닐경우를 탐지한다.

 

즉, Via: 다음으로 스페이스(\s) 이 어느정도 나온 뒤 SIP2.0이 아닌것을 탐지한다.

 

그러나

테스트 해본 결과

 

root@localhost> pcretest

re>  /^Via\x3A\s+(?!SIP\x2F2\x2E0)/i

data> Via: SIP/2.1

 0: Via:

data> Via: SIP/2.0

No match

data> Via:   SIP/2.0

 0: Via:

data>

 

 

SIP/2.0으로 넣어도 스페이스 공간이 1개 이상일 경우 오탐을 일으킨다.

 

 

바람직한 룰은 다음과 같다.

 

alert udp $EXTERNAL_NET any -> $HOME_NET 5060

(content:”Via|3A|”; nocase; pcre:”/^Via\x3A\s+SIP\x2F(?!2\x2E0)/smi”;

reference:url,www.ietf.org/rfc/rfc3261.txt; classtype:misc-activity; sid:11975; rev:2;)

  

SIP/ 까지 검사하고 2.0이 아닌것만 탐지하는 식이다.

즉, \s 하고 양을 나타내는 *,?,+ 뒤에는 바로 (?!를 쓰지않는 것이 좋겠다.

Advertisements

About this entry