Не удается обновить sudo до последней версии CVE -2021 -3156

Все группы находятся в базе данных group. Чтобы подсчитать количество членов группы, извлеките членов и посчитайте запятые между ними в -. Количество участников группы равно 1 плюс это число.

#!/bin/sh

n=$( getent group "$1" | cut -d : -f 4 | grep -o, | wc -l )

printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"

Недостатком этого подхода является то, что вы всегда будете получать как минимум 1 участника в качестве выходных данных, даже если группа недействительна.Однако мы можем сначала проверить допустимую группу:

#!/bin/sh

if ! getent group "$1" >/dev/null; then
    printf 'No such group: %s\n' "$1" >&2
    exit 1
fi

n=$( getent group "$1" | cut -d : -f 4 | grep -o, | wc -l )

printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"

Сценарий принимает как числовые GID, так и имена групп в качестве первого аргумента командной строки.

С awkвы бы вместо этого сделали

n=$( getent group "$1" | awk -F : '{ print split($4,dummy,",") }' )

, а затем не добавлять 1 к $nпозже или просто

getent group "$1" | awk -F : '
    { 
        printf("There are %d members of group %s (%d)\n",
            split($4,dummy,","), $1, $3)
    }'

без оболочки ()printfили переменной n.

Это подсчитывает членство в группах, записанное в базе данных group. Чтобы подсчитать только первичных членов группы, используйте что-то вроде

n=$( getent passwd | cut -d : -f 4 | grep -cxF "$1" )

Но опять же, вы можете сначала проверить, что $1действительно является допустимым идентификатором группы.

Чтобы подсчитать как первичные, так и дополнительные групповые принадлежности, может быть лучше зациклиться на всех пользователях и использовать idдля каждого:

getent passwd | cut -d : -f 1 |
while read user; do
    if id -G "$user" | tr ' ' '\n' | grep -q -xF "$1"; then
        n=$(( n + 1 ))
    fi
done

Это позволит извлечь все имена пользователей, затем вызвать id -Gдля каждого и преобразовать полученный список GID в список с разделителями -новой строки. Затем grepопределяет, является ли данный GID частью этого списка, и если да, nувеличивается на единицу.

Или быстрее, но уродливее,

n=$( getent passwd | cut -d : -f 1 |
     while read user; do
         id -G "$user"
     done | tr ' ' '\n' | grep -c -xF "$1" )

или даже,

n=$( getent passwd    | cut -d : -f 1 |
     xargs -n 1 id -G | tr ' ' '\n'   |
     grep -c -xF "$1" )

Причина, по которой это может быть хорошим подходом, заключается в том, что могут быть пользователи, основная группа которых не содержит себя в базе данных group.

0
29.01.2021, 14:31
2 ответа

Судя по журналу изменений, этот патч применяется через обычное обновление:

2021-01-20 - Radovan Sroka <rsroka@redhat.com> - 1.8.23-10.1
- RHEL 7.9.Z ERRATUM
- CVE-2021-3156
Resolves: rhbz#1917729

Двоичный пакет sudo -1.8.23 -10.el7 _9.1.x86 _64.rpm список изменений.

Проверка sudoуязвимости с помощью следующей команды:

sudoedit -s /

Исправленные версииsudoдолжны печататьusage:

usage: sudoedit [-AknS] [-r role] [-t type] [-C num] [-g group] [-h host] [-p
                prompt] [-T timeout] [-u user] file...

Уязвимаяsudoверсия должна печатать:

sudoedit: /: not a regular file
2
18.03.2021, 22:33

Во-первых, имейте в виду, что использование звездочек без экранирования может привести к расширению оболочки, что может привести к той же проблеме, с которой вы столкнулись.

Во-вторых, нет необходимости использовать звездочку вообще, yum update sudoбудет вполне достаточно.

В-третьих, если у вас есть другие пакеты, связанные с sudo, например. sudo-logsrvd, тогда вы можете запустить yum update 'sudo*'.

Наконец, сообщите версию sudo черезrpm -q sudo

0
18.03.2021, 22:33

Теги

Похожие вопросы