[devel] Buffer overflow - help needed

Sergey Vlasov =?iso-8859-1?q?vsu_=CE=C1_altlinux=2Eru?=
Вт Апр 22 17:11:45 MSD 2008


On Tue, Apr 22, 2008 at 04:19:12PM +0400, Vitaly Ostanin wrote:
> Есть такая проблема:
> https://bugzilla.altlinux.org/show_bug.cgi?id=15284
> 
> Моего кунфу на неё пока не хватает. Если знатоки C посмотрят и
> скажут, как исправить, будет очень здорово. Посмотреть можно для
> скорости здесь:
> 
> http://git.altlinux.org/people/bga/packages/?p=amanda.git;a=blob;f=amanda/common-src/match.c;h=dba15c802c28add576135af2f4a85476a2ccfd57;hb=c7308c105b84b606039fb617cc7fe2bd7799f1a9#l533

Во-первых, тот, кто вызвал amfetchdump таким образом, не дочитал
amanda(8) в части DATESTAMP EXPRESSION - дата должна записываться без
'-', этот символ используется как разделитель при указании диапазона.

Во-вторых, функция match_datestamp() написана отвратительно -
например, код вида

        strncpy(mydateexp, dateexp, strlen(dateexp));

наводит на мысли, что писавший его не понимал, что делает strncpy() и
зачем нужна эта функция.  Дальше есть условие, которое никогда не
может выполниться:

    if(mydateexp[strlen(mydateexp)] == '$') {

(очевидно, тут нужно strlen(mydateexp)-1 и перед ним проверка на
пустую строку).

Наконец, дальше находится вот такой кусок:

    if((dash = strchr(mydateexp,'-'))) {
        if(match_exact == 1) {
            error("Illegal datestamp expression %s",dateexp);
            /*NOTREACHED*/
        }
        len = (size_t)(dash - mydateexp);
        len_suffix = strlen(dash) - 1;
        len_prefix = len - len_suffix;

При передаче недопустимого параметра вида "2008-04-09" получается
len_suffix > len, однако это не проверяется, в результате последующий
вызов strncpy(lastdate, mydateexp, len_prefix) приводит к переполнению
буфера.

Те же самые ошибки повторяются дальше в функции match_level() (и
вообще эти функции отличаются только текстом сообщения об ошибке).
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20080422/647f8e99/attachment-0002.bin>


Подробная информация о списке рассылки Devel