From e5611f929c5def5d8f1121c50c90a1091a4049e7 Mon Sep 17 00:00:00 2001 From: Tomasz Kojm Date: Thu, 20 Mar 2008 21:15:14 +0000 Subject: [PATCH] update documentation git-svn: trunk@3730 --- ChangeLog | 4 + docs/signatures.pdf | Bin 24203 -> 27199 bytes docs/signatures.tex | 185 ++++++++++++++++++++++++++------------------ 3 files changed, 112 insertions(+), 77 deletions(-) diff --git a/ChangeLog b/ChangeLog index 12dc058c2..0be9f7349 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +Thu Mar 20 21:27:22 CET 2008 (tk) +--------------------------------- + * doc/signatures.[pdf,tex]: update documentation + Thu Mar 20 21:06:30 CET 2008 (acab) ----------------------------------- * libclamav/blob.[ch]: Fix for "bad file descriptor" under win32, properly diff --git a/docs/signatures.pdf b/docs/signatures.pdf index 72ed53085b77c6544c20ddb517f10eb545d2e263..e2e9c06d85ef0e1efd1d9ba411971e189181676b 100644 GIT binary patch literal 27199 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 Vb0w0K8XP5!M1h2aFxsl1{{hupAy)tZ literal 24203 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 bi5FJv@dZqt04FyDp^;$1ym>ai*%JN>VlL_% diff --git a/docs/signatures.tex b/docs/signatures.tex index ee6e85dc1..32b87df71 100644 --- a/docs/signatures.tex +++ b/docs/signatures.tex @@ -15,34 +15,38 @@ \noindent \section{Introduction} - CVD (ClamAV Virus Database) is a digitally signed tarball file that - contains one or more databases. The header is a 512 bytes long string - with colon separated fields: + CVD (ClamAV Virus Database) is a digitally signed container that + includes signature databases in various text formats. The header + of the container is a 512 bytes long string with colon separated fields: \begin{verbatim} ClamAV-VDB:build time:version:number of signatures:functionality -level required:MD5 checksum:digital signature:builder name:build time (sec) +level required:MD5 checksum:digital signature:builder name:build +time (sec) \end{verbatim} - \verb+sigtool --info+ displays detailed information about a CVD file: + \verb+sigtool --info+ displays detailed information about a given CVD file: \begin{verbatim} zolw@localhost:/usr/local/share/clamav$ sigtool -i main.cvd -Build time: 09 Jun 2006 22-19 +0200 -Version: 39 -# of signatures: 58116 -Functionality level: 8 -Builder: tkojm -MD5: a9a400e70dcbfe2c9e11d78416e1c0cc -Digital signature: 0s12V8OxLWO95fNNv+kTxj7CEWBW/1TKOGC7G4RelhogruBYw8dJeIX2+yhxex/XsLohxoEuXxC2CaFXiiTbrbvpK2USIxkpn53n6LYVV6jKgkP5sa08MdJE7cl29H1slfCrdaevBUZ1Z/UefkRnV6p3iQVpDPsBwqFRbrem33b +File: main.cvd +Build time: 09 Dec 2007 15:50 +0000 +Version: 45 +Signatures: 169676 +Functionality level: 21 +Builder: sven +MD5: b35429d8d5d60368eea9630062f7c75a +Digital signature: dxsusO/HWP3/GAA7VuZpxYwVsE9b+tCk+tPN6OyjVF/U8 +JVh4vYmW8mZ62ZHYMlM903TMZFg5hZIxcjQB3SX0TapdF1SFNzoWjsyH53eXvMDY +eaPVNe2ccXLfEegoda4xU2TezbGfbSEGoU1qolyQYLX674sNA2Ni6l6/CEKYYh Verification OK. \end{verbatim} - There are two CVD databases in ClamAV: \emph{main.cvd} and \emph{daily.cvd} - for daily updates. + The ClamAV project distributes two CVD files: \emph{main.cvd} and + \emph{daily.cvd}. - \section{Signature format} + \section{Signature formats} \subsection{MD5} - There's an easy way to create signatures for static malware using MD5 - checksums. To create a signature for \verb+test.exe+ use the \verb+--md5+ - option of sigtool: + The easiest way to create signatures for ClamAV is to use MD5 checksums, + however this method can be only used against static malware. To create + a signature for \verb+test.exe+ use the \verb+--md5+ option of sigtool: \begin{verbatim} zolw@localhost:/tmp/test$ sigtool --md5 test.exe > test.hdb zolw@localhost:/tmp/test$ cat test.hdb @@ -56,33 +60,36 @@ test.exe: test.exe FOUND ----------- SCAN SUMMARY ----------- Known viruses: 1 Scanned directories: 0 -Engine version: 0.88.2 +Engine version: 0.92.1 Scanned files: 1 Infected files: 1 Data scanned: 0.02 MB Time: 0.024 sec (0 m 0 s) \end{verbatim} - You can edit it to change the name (by default sigtool uses the file name). - Remember that all MD5 signatures must be placed inside \verb+*.hdb+ files - and you can include any number of signatures inside a single file. To get - them automatically loaded every time clamscan/clamd starts just copy them - to the local virus database directory. + You can change the name (by default sigtool uses the name of the file) + and place it inside a \verb+*.hdb+ file. A single database file can + include any number of signatures. To get them automatically loaded + each time clamscan/clamd starts just copy the database file(s) into + the local virus database directory (eg. /usr/local/share/clamav). \subsection{MD5, PE section based} - You can create an MD5 signature for a specific section in a PE file. - Such signatures are stored in .mdb files in the following format: + You can create a MD5 signature for a specific section in a PE file. + Such signatures shall be stored inside \verb+.mdb+ files in the + following format: \begin{verbatim} PESectionSize:MD5:MalwareName \end{verbatim} + The easiest way to generate MD5 based section signatures is to extract + target PE sections into separate files and then run sigtool with the + option \verb+--mdb+ \subsection{Hexadecimal signatures} - ClamAV keeps viral fragments in hexadecimal format. If you don't know how - to get a proper signature please try the MD5 method or submit your sample - at \url{http://www.clamav.net/sendvirus} + ClamAV stores all signatures in a hexadecimal format. By a hex-signature + here we mean a fragment of a malware's body converted into a hexadecimal + string which can be additionally extended with various wildcards. \subsubsection{Hexadecimal format} - You can use \verb+sigtool --hex-dump+ to convert arbitrary data into - hexadecimal format: + You can use \verb+sigtool --hex-dump+ to convert any data into a hex-string: \begin{verbatim} zolw@localhost:/tmp/test$ sigtool --hex-dump How do I look in hex? @@ -95,12 +102,13 @@ How do I look in hex? \item \verb+??+\\ Match any byte. \item \verb+a?+\\ - Match high nibble (high four bits). \textbf{IMPORTANT NOTE:} Nibble - matching is only available in libclamav with the functionality level - 17 therefore please only use it with .ndb signatures, each followed - by ":17" (MinEngineFunctionalityLevel, see \ref{ndb}). + Match a high nibble (the four high bits). \textbf{IMPORTANT NOTE:} + The nibble matching is only available in libclamav with the + functionality level 17 and higher therefore please only use it with + .ndb signatures followed by ":17" (MinEngineFunctionalityLevel, + see \ref{ndb}). \item \verb+?a+\\ - Match low nibble (low four bits). + Match a low nibble (the four low bits). \item \verb+*+\\ Match any number of bytes. \item \verb+{n}+\\ @@ -109,47 +117,56 @@ How do I look in hex? Match n or less bytes. \item \verb+{n-}+\\ Match n or more bytes. - \item \verb+(a|b)+\\ - Match a or b (you can use more alternate characters). + \item \verb+(aa|bb|cc|..)+\\ + Match aa or bb or cc.. + \item \verb+HEXSIG[x-y]aa+ or \verb+aa[x-y]HEXSIG+\\ + Match aa anchored to a hex-signature, see + \url{https://wwws.clamav.net/bugzilla/show_bug.cgi?id=776} for + a discussion and examples. \end{itemize} + The range signatures \verb+*+ and \verb+{}+ virtually separate + a hex-signature into two parts, eg. \verb+aabbcc*bbaacc+ is treated + as two sub-signatures \verb+aabbcc+ and \verb+bbaacc+ with any number + of bytes between them. It's a requirement that each sub-signature + includes a block of two static characters somewhere in its body. \subsubsection{Basic signature format} - The simplest signatures are of the format: + The simplest (and now deprecated) signature format is: \begin{verbatim} MalwareName=HexSignature \end{verbatim} - ClamAV will analyse a whole content of a file trying to match it. All - signatures of this type must be placed in \verb+*.db+ files. + ClamAV will scan the entire file looking for HexSignature. All + signatures of this type must be placed inside \verb+*.db+ files. \subsubsection{Extended signature format}\label{ndb} - Extended signature format allows on including additional information about - target file type, virus offset and required engine version. - The format is: + The extended signature format allows for specification of additional + information such as a target file type, virus offset or engine version, + making the detection more reliable. The format is: \begin{verbatim} MalwareName:TargetType:Offset:HexSignature[:MinEngineFunctionalityLevel:[Max]] \end{verbatim} - where \verb+TargetType+ is one of the following decimal numbers describing - the target file type: + where \verb+TargetType+ is one of the following numbers specifying + the type of the target file: \begin{itemize} \item 0 = any file \item 1 = Portable Executable - \item 2 = OLE2 component (e.g. VBA script) + \item 2 = OLE2 component (e.g. a VBA script) \item 3 = HTML (normalised) \item 4 = Mail file - \item 5 = Graphics (to help catching exploits in JPEG files) + \item 5 = Graphics \item 6 = ELF + \item 7 = ASCII text file (normalised) \end{itemize} And \verb+Offset+ is an asterisk or a decimal number \verb+n+ possibly - combined with a special string: + combined with a special modifier: \begin{itemize} \item \verb+*+ = any \item \verb+n+ = absolute offset \item \verb+EOF-n+ = end of file minus \verb+n+ bytes \end{itemize} - Signatures for Portable Executables files (target = 1) also support: + Signatures for PE and ELF files additionally support: \begin{itemize} - \item \verb#EP+n# = entry point plus n bytes (\verb#EP+0# if you - want to anchor to \verb+EP+) + \item \verb#EP+n# = entry point plus n bytes (\verb#EP+0# for \verb+EP+) \item \verb#EP-n# = entry point minus n bytes \item \verb#Sx+n# = start of section \verb+x+'s (counted from 0) data plus \verb+n+ bytes @@ -166,15 +183,17 @@ MalwareName:TargetType:Offset:HexSignature[:MinEngineFunctionalityLevel:[Max]] 0.91 will silently ignore the \verb+MaxShift+ extension and only use \verb+Offset+.\\ + \noindent All signatures in the extended format must be placed inside \verb+*.ndb+ files. \subsection{Signatures based on archive metadata} - In order to detect some malware which spreads inside of Zip or RAR archives - (especially encrypted ones) you can try to create a signature describing - a malicious archived file. The general format is: + Signatures based on metadata inside archive files can provide an effective + protection against malware that spreads via encrypted zip or rar + archives. The format of a metadata signature is: \begin{verbatim} virname:encrypted:filename:normal size:csize:crc32:cmethod:fileno:max depth \end{verbatim} + where the corresponding fields are: \begin{itemize} \item Virus name \item Encryption flag (1 -- encrypted, 0 -- not encrypted) @@ -186,15 +205,22 @@ virname:encrypted:filename:normal size:csize:crc32:cmethod:fileno:max depth \item File position in archive (* to ignore) \item Maximum number of nested archives (* to ignore) \end{itemize} - The database should have the extension \verb+.zmd+ or \verb+.rmd+ for - Zip or RAR archive respectively. + The database file should have the extension of \verb+.zmd+ or + \verb+.rmd+ for zip or rar metadata respectively. - \subsection{Whitelist database} + \subsection{Whitelist databases} To whitelist a specific file use the MD5 signature format and place - it in the database with the extension \verb+.fp+. + it inside a database file with the extension of \verb+.fp+.\\ + + \noindent + To whitelist a specific signature inside main.cvd add the following + entry into daily.ign or a local file local.ign: +\begin{verbatim} +db_name:line_number:signature_name +\end{verbatim} \subsection{Signature names} - ClamAV uses the following prefixes for particular malware: + ClamAV uses the following prefixes for signature names: \begin{itemize} \item \emph{Worm} for Internet worms \item \emph{Trojan} for backdoor programs @@ -210,7 +236,7 @@ virname:encrypted:filename:normal size:csize:crc32:cmethod:fileno:max depth \item \emph{BAT} for BAT malware \item \emph{W97M}, \emph{W2000M} for Word macro viruses \item \emph{X97M}, \emph{X2000M} for Excel macro viruses - \item \emph{O97M}, \emph{O2000M} for general Office macro viruses + \item \emph{O97M}, \emph{O2000M} for generic Office macro viruses \item \emph{DoS} for Denial of Service attack software \item \emph{DOS} for old DOS malware \item \emph{Exploit} for popular exploits @@ -230,30 +256,35 @@ virname:encrypted:filename:normal size:csize:crc32:cmethod:fileno:max depth \section{Special files} \subsection{HTML} - ClamAV contains a special HTML normalisation code required to detect + ClamAV contains a special HTML normalisation code which helps to detect HTML exploits. Running \verb+sigtool --html-normalise+ on a HTML file - should create the following files: + should generate the following files: \begin{itemize} - \item comment.html - the whole file normalised - \item nocomment.html - the file normalised, with all comments removed - \item script.html - the parts of the file in \verb+