출처 : https://purehacking.com/portal/index.php?q=node/26

원제 : Virus Detection in ModSecurity


modsecurity & clamav를 이용한 업로드파일 검사를 이전에 포스팅 했었는데 이번엔 lua 스크립트를 이용한 방법을

소개합니다. 위에서 소개한 방법에서 perl 스크립트에서 lua 스크립트를 이용하고 apachesecurity.net에서 제공하는

blacklist를 이용, 바이러스를 업로드한 ip를 blacklist 처리하는 방식의 동작을 하게됩니다.


lua 스크립트를 이용하기 위한 modsecurity rule

  1. SecRule FILES_TMPNAMES "@inspectFile /opt/modsecurity/bin/modsec-clamscan.lua" 
  2. "phase:2,t:none,log,deny"


적용전 확인해야 될 사항

1. clamscan이 아닌 clamdscan을 이용함 ( clamdscan을 이용하면 이미 떠 있는 clamd 데몬에 접근을 하게 되어 매번

바이러스 검사시에 생길 수 있는 필요없는 부하를 줄일 수 있습니다)

2. clamav유저를 apache (웹서버) 그룹에 포함 시킴

3. SecUploadFileMode direction을 0640으로 설정해 그룹이 접근 가능하게 함

4. blacklist를 이용해 해당 ip를 일정시간 차단함


lua 스크립트의 내용은 아래와 같습니다.

  1. --[[
  2.   This script can be used to inspect uploaded files for viruses
  3.   via ClamAV. To implement, use with the following ModSecurity rule:

  4.   SecRule FILES_TMPNAMES "@inspectFile /opt/modsecurity/bin/modsec-clamscan.lua" 
  5. "phase:2,t:none,log,deny"

  6.   Author: Josh Amishav-Zlatin
  7.   Requires the clamav-daemon and liblua5.1-rex-pcre0 Debian packages (or other
  8.   OS equivalent)
  9. ]]--
  10.  
  11. function main(filename)
  12.   local rex = require "rex_pcre"
  13.   local remote_addr = m.getvar("REMOTE_ADDR"); -- Retrieve remote IP address
  14.  
  15.   -- Configure paths
  16.   local clamscan  = "/usr/bin/clamdscan"
  17.   local blacklist = "/opt/modsecurity/bin/blacklist"
  18.   local duration  = "3600"
  19.  
  20.   -- The system command we want to call
  21.   local cmd = clamscan .. " --stdout --disable-summary"
  22.  
  23.   -- Run the command and get the output
  24.   local f = io.popen(cmd .. " " .. filename)
  25.   local l = f:read("*a")
  26.   m.log(9, l)
  27.  
  28.   -- Check the output for the FOUND or ERROR strings which indicate
  29.   -- an issue we want to block access on
  30.   local isVuln = rex.match(l, "FOUND")
  31.   local isError = rex.match(l, "ERROR")
  32.  
  33.   if isVuln ~= nil then
  34.     local b = io.popen(blacklist .. " block " .. remote_addr .. " " ..  duration)
  35.     return "Virus Detected"
  36.   elseif isError ~= nil then 
  37.     return "Error Detected"
  38.   else
  39.     return nil
  40.   end
  41. end
  42.  

lua 스크립트를 불러오는 rule은 적절히 수정해 사용하시면 되겠습니다. 당연한 얘기지만 좀더 정확한 이해와 적용을

위해서는 원문을 꼭 읽어보시기를 권합니다.


기존의 perl 스크립트를 이용한 modsecurity & clamav를 이용한 업로드파일 검사와 어떤 차이점이 있는지

시간나는대로 테스트 해보고 결과(?)를 알려드리겠습니다 :)

+ Recent posts