악성 이메일 본문에 대한 Procmail 정규식 레시피

악성 이메일 본문에 대한 Procmail 정규식 레시피

최근 직장에서 이메일 본문에 악성 코드로 보이는 내용이 포함된 이메일을 받기 시작했습니다. 다음과 같이 정규 표현식을 사용하여 긴 문자열에 나열된 비단어 문자만 일치시키는 procmail 레시피를 만들려고 합니다.

/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afe0:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Jenny:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#preston:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#Afectarac:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#FORTHCO:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#backgrounds:/]\/[%}(-:{{[%+\!(?|}[[+{>-|*;\]}>?]}?(>:-\-/[\[%-=\//>[??+]}}(:)/|{/#legumes

공백이 없다는 점에 유의하세요. 이것은 작은 예입니다. 일부 이메일의 줄 길이는 20,000자를 넘습니다. 이로 인해 스팸 필터링이 엉망이 되고 있으며 공백 구분 기호 없이 단어가 아닌 문자의 긴 줄을 일치시킬 수 있는 방법이 있기를 바랍니다. 지금까지 아래의 여러 변형/조각/조합을 시도했지만 부분적인 성공만 거두었습니다. 많은 거짓 긍정을 포착하지 않고 이를 수행할 수 있는 방법을 찾는 데 어려움을 겪고 있습니다.

:0 
* B ?? ^.*(!@#$%^&*()[]{})+ && ! </([a-z|A-Z])/>
$DEFAULT/MalSpam/

나는 일치하는 정규식을 만든 다음 줄당 총 문자 수가 특정 수(예: 500)를 초과하는 경우 별도의 이메일로 보내기 위해 다른 규칙과 결합할 수 있다고 생각했습니다. 아직 이 부분을 파악하지 못했습니다... 과거에 제가 사용한 다른 정규식에는 단어가 아닌 문자에만 일치하는 \W 플래그가 있었습니다. procmail에 해당하는 것이 있습니까? 어떻게 해야 하나요?

답변1

마지막 질문에 관해서 \W는 필요하지 않습니다. 반대 작업을 수행할 수 있습니다 \w. 예를 들어, 이것이 단어 문자 [a-zA-Z0-9_](예: Vim의 정의 \w)라고 생각되면 를 사용하세요 [^a-zA-Z0-9_].

답변2

귀하가 시도한 표면적인 수정은 다음과 같습니다.

:0 
*   B ?? [][!@#$%^&*(){}]+
* ! B ?? </[a-zA-Z]+/>
$DEFAULT/MalSpam/

</내가 올바르게 추측했다면, 당신은 두 개 이상의 구두점 문자 시퀀스를 일치시키려고 하고, 부정적인 조건으로 및 사이의 알파벳 문자 시퀀스를 일치시키려고 합니다 />(일치하는 항목이 있으면 레시피가 일치하지 못하게 됨을 의미함).

하지만,두 개의 구두점 문자(예: !!)는 첫 번째 정규식과 일치합니다. 왜 두 번째 조건을 그렇게 입력했는지 이해할 수 없습니다.

한 가지 과제는 많은 문장 부호 문자가 정규식 메타 문자라는 것입니다. 리터럴 [또는 을 (일치 시키려면 *백슬래시로 이스케이프 처리하거나 문자 클래스에 넣어야 합니다. ( 포함 [된 문자 클래스는 이해하는 데 시간이 걸립니다. 문자 클래스 대괄호 안의 리터럴 [[]입니다 . .... 그리고 이를 포함하고 포함해야 하는 문자 클래스는 순서대로 포함됩니다 .) 첫 번째 정규 표현식을 단순하게 만들었습니다. 배치하여[[]][[][]모든 것문자 클래스에서는 실제로는 너무 광범위할 수 있습니다. 예를 들어 4~5개의 순서를 순차적으로 요청할 수 있습니다. (불행히도 Procmail의 정규식 변형은 egrep숫자 [class]{5,}수량자를 지원하지 않습니다. 여기서는 유용할 것입니다.)

:0B
* [][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}][][!@#$%^&*(){}]
* ! </[a-zA-Z]+/>
$DEFAULT/MalSpam/

자세히 보면 첫 번째가 [][!@#$%^&*(){}]5번 반복되는 것을 볼 수 있습니다. 더 길게 만들고 싶다면(예: 500개의 인접한 항목) 필요한 만큼 반복하면 됩니다. 전체 표현식이 다음보다 긴 경우에도 이 점에 유의해야 합니다 LINEBUF. 7자 정규식을 500번 사용할 수 있는 공간을 확보하려면 10,200바이트이므로 LINEBUF최소한 큰 크기인지 확인해야 합니다. 이 긴 표현이 포함된 레시피 Before입니다.

B또한 레시피의 플래그를 사용하면 B ??각 개별 레시피 라인에 플래그를 배치할 필요가 없어집니다.

메시지 길이를 비교하려면 >원하는 숫자와 를 사용하세요. :0B플래그가 있으면 * > 512일치합니다.길이가 512바이트를 초과합니다.

마지막 질문의 경우 기본적으로 문자 클래스 ( 범위 나 범위 또는 범위 에 없는 단일 문자 ) \W와 동일합니다 .[^A-Za-z0-9_]A-Za-z0-9_

관련 정보