Hi there,

On Sat, 19 Nov 2022, Andy Schmidt via clamav-users wrote:

Unfortunately, while will specifying "Win.Packer" or even "PUA.Win.Packer" will 
APPEAR to work, the program logic in ExcludePUA  is completely faulty (almost arbitrary).

Yes, it WILL exclude those two - but the problem is, it will exclude GENERICALLY EVERYTHING ELSE 
(e.g., ALL "Win" or  ALL "PUA") - in which case you might as well turn off the 
entire PUA feature!

I finally remembered that I had been down this exact rabbit hole years ago - 
and found this bug report:
https://bugzilla.clamav.net/show_bug.cgi?id=12632#c5

It seems the entire PUA feature is a step-child - by now, not even the config 
sample and documentation are current. Maybe its time to pull the plug on it, if 
no one is taking ownership to making it work?

(Yes, I realize the answer is to just "contribute" the fixes myself - but that 
assumes that every ClamAV user is also a C++ programmer, which I am not.)

The problem in the currently released code is that a 'category' turns
out to be only the second piece of a string made up of potentially
several dot-separated pieces.  It needs more granularity.

Try replacing the function cli_chkpua() in .../libclamav/readdb.c with this:

8<----------------------------------------------------------------------
static int cli_chkpua(const char *signame, const char *pua_cats, unsigned int 
options)
{
    // 2022.11.20 == GWH ==  "Categories" are dot-separated strings.
    // The string in the 'pua_cats' argument contains the PUA "categories" 
which are to be (depending on the configuration) included or excluded.
    // The category name in 'cat' is to be the string between the first and 
last dots in the signature string held in the 'signame' argument.
    // We will extract the category thus defined from the string in 'signame' 
and then look for this category within in the string in pua_cats.
    char cat[32], *cat_pt, *pt1, *pt2, *endsig;
    const char *sig;
    int ret;

    cli_dbgmsg("cli_chkpua: Checking signature [%s]\n", signame);

    if (strncmp(signame, "PUA.", 4)) {
        cli_dbgmsg("Skipping signature %s - no PUA prefix\n", signame);
        return 1;
    }
    sig = signame + 3;
    if (!(pt1 = strchr(sig + 1, '.'))) {                                        
// pt1 points to the FIRST dot in the string in 'signame' if there is one, else 
NULL.
        cli_dbgmsg("Skipping signature %s - bad syntax\n", signame);
        return 1;
    }
    if ( (pt2 = strrchr(sig + 1, '.')) != pt1 ) {                               
// pt2 points to the LAST dot in the string in 'signame' if there is one, else 
NULL.
        cli_dbgmsg("Signature has at least three dots [%s]\n", signame);        
// If they happen to be the same dot, there are only two of them in the signature.
    }
//  else {
//      cli_dbgmsg("Seems signature only has two dots [%s]\n", signame);
//  }
    if ((unsigned int)(pt1 - sig + 2) > sizeof(cat)) {
        cli_dbgmsg("Skipping signature %s - too long category name, length 
approaching %d characters\n", signame, (unsigned int)(pt1 - sig + 2) );
        return 1;
    }
//  else {
//      cli_dbgmsg("Allowing signature %s; OK length category name, length 
approaching %d characters\n", signame, (unsigned int)(pt1 - sig + 2) );
//  }
    if ((unsigned int)(pt2 - sig + 2) > sizeof(cat)) {
        cli_dbgmsg("Skipping signature %s - too long category name, length 
approaching %d characters\n", signame, (unsigned int)(pt2 - sig + 2));
        return 1;
    }
//  else {
//      cli_dbgmsg("Allowing signature %s; OK length category name, length 
approaching %d characters\n", signame, (unsigned int)(pt2 - sig + 2));
//  }

    endsig = strrchr(sig, '.');
    strncpy(cat, sig, strlen(sig) - strlen(endsig) + 1);                        
// Put in 'cat' the string between the first and last dots in sig, including 
the dots.
    cat[strlen(sig) - strlen(endsig) + 1] = 0;
    cat_pt                = strstr(pua_cats, cat);                              
// Find if cat exists in pua_cats.
//  cli_dbgmsg("cli_chkpua:           pua_cats=[%s]\n", pua_cats                
 );
//  cli_dbgmsg("cli_chkpua:            signame=[%s]\n", signame                 
 );
    cli_dbgmsg("cli_chkpua:                cat=[%s]\n", cat                     
 );
    cli_dbgmsg("cli_chkpua:                sig=[%s]\n", sig                     
 );
//  cli_dbgmsg("cli_chkpua:             endsig=[%s]\n", endsig                  
 );
//  cli_dbgmsg("cli_chkpua:             cat_pt=[%s]\n", cat_pt  ? cat_pt : 
"null");
//  cli_dbgmsg("cli_chkpua:                pt1=[%s]\n", pt1     ? pt1 : "null"  
 );
//  cli_dbgmsg("cli_chkpua:                pt2=[%s]\n", pt2     ? pt2 : "null"  
 );
    if (options & CL_DB_PUA_INCLUDE)
        ret = cat_pt ? 0 : 1;
    else
        ret = cat_pt ? 1 : 0;

    if (ret)
      cli_dbgmsg("Skipping PUA signature %s - excluded category %s\n", signame, 
cat);
    return ret;
}
8<----------------------------------------------------------------------

No promises, but it's loaded the DB OK here.  Please feel free to
correct mistakes in this and push to Github or whatever.

HTH

--

73,
Ged.
_______________________________________________

Manage your clamav-users mailing list subscription / unsubscribe:
https://lists.clamav.net/mailman/listinfo/clamav-users


Help us build a comprehensive ClamAV guide:
https://github.com/Cisco-Talos/clamav-documentation

https://docs.clamav.net/#mailing-lists-and-chat

Reply via email to