Добавление новых оскорблений sudo

Добавление новых оскорблений sudo

Я только что прочитал еще раз этот пост: Где хранятся оскорбления sudo?

Но у меня просто естькрасивыйвопрос об этих оскорблениях:

Можем ли мы добавить новые, добавив другие файлы (вместо изменения заголовка внутри plugins/sudoers)?

Текущие файлы оскорблений sudo:

  • ins_2001.h
  • ins_classic.h
  • ins_csops.h
  • ins_goons.h
  • insults.h

решение1

Нет, вы не можете просто «добавить» оскорбления в каталог и ожидать, что они сработают. Единственный способ добавить новые оскорбления — перекомпилировать sudoтак, чтобы он включил эти оскорбления во время компиляции.

Ссылка из вашего вопроса (Где хранятся оскорбления sudo?) объясняет, что это за файлы:

Файл abuses.h содержит инструкции компилятору о том, какие из вышеперечисленных оскорблений следует включить в скомпилированное ядро. Действительно, вы можете создать свой собственный файл оскорблений, добавить его имя в abuses.h и перекомпилировать...

Но вам НУЖНО будет добавить оскорбления и затем перекомпилировать, чтобы включить их. Однако, делая это, вам придется перекомпилировать, sudoесли есть обновления безопасности и т. д., и, скорее всего, это может вызвать проблемы безопасности в будущем, если вы не перекомпилируете с включенными исправлениями безопасности.

решение2

Добавлять новые оскорбления можно только путем замены существующих оскорблений такой же или большей длины.

Из второго ответа по вашей ссылке есть такие фразы:

ins_2001.h (оскорбления из «Космической одиссеи 2001 года»):

/*
 * HAL insults (paraphrased) from 2001.
 */

"Just what do you think you're doing Dave?",
"It can only be attributed to human error.",

Найти файл

$ grepall "Just what do you think you're doing Dave?"
Binary file /usr/lib/sudo/sudoers.so matches

Хорошо, теперь мы знаем имя файла. Это была легкая часть.

Сделайте резервную копию файла

Сначала сделайте резервную копию (ведь мы всегда помним об этом, верно?):

$ sudo cp -a /usr/lib/sudo/sudoers{.so,.so.bak}

$ ll /usr/lib/sudo/sudoers{.so,.so.bak}
-rw-r--r-- 1 root root 316768 Oct 11 06:01 /usr/lib/sudo/sudoers.so
-rw-r--r-- 1 root root 316768 Oct 11 06:01 /usr/lib/sudo/sudoers.so.bak

Сделать сценарий

Затем назовем наш скрипт sudoinsults:

#!/bin/bash

# NAME: sudoinsult
# PATH: $HOME/askubuntu/
# DESC: For: https://askubuntu.com/questions/1188779/adding-new-sudo-insults
# DATE: November 14, 2019.

# NOTE: Change sudo insults to personal favorites

# Build array of insults from disk
IFS=$'\n' Arr=( $(cat sudoinsult.txt) )

# Initialize variables
File="/usr/lib/sudo/sudoers.so"
upper=0
Spaces="                                                                     "
Spaces="$Spaces""                                                            "

[[ ${#Arr[@]} -gt 0 ]] && upper=$(( ${#Arr[@]} - 1 ))
[[ $upper -gt 0 ]] && for (( i=0; i<upper; i=i+2 )) ; do
    Search="${Arr[i]}"      # Move array indices to named variables
    Replace="${Arr[i+1]}"   #  for a simpler life.

    printf "Replacing: '%s'\n     With: '%s'\n" "$Search" "$Replace"
    if [[ "${#Search}" -lt "${#Replace}" ]] ; then
        echo "Replacement can't be longer than original"
        continue
    elif [[ "${#Search}" -lt 8 ]] ; then
        echo "Original insult cannot be less than 8 characters"
        continue
    elif [[ "${#Search}" -gt "${#Spaces}" ]] ; then
        echo "Original insult cannot be longer than ${#Spaces} characters"
        continue
    elif [[ "${#Replace}" -lt 1 ]] ; then
        echo "Replacement insult cannot be less than 1 character"
        continue
    elif ! grep "$Search" "$File" >/dev/null ; then
        echo "Search insult not found in $File"
        continue
    fi

    # Pad replacement with spaces as needed.
    ReplaceS="$Replace${Spaces:0:$((${#Search} - ${#Replace}))}"
    [[ "${#ReplaceS}" -ne "${#Search}" ]] && \
        { echo Internal error ReplaceS different length than Search; exit; }

# Looks wrong: https://unix.stackexchange.com/a/354493/200094
#y="${y:0:40}${forty:0:$((40 - ${#y}))}"
#echo "'${y}'"
    sed -i "s/$Search/$ReplaceS/" "$File"
    (( InsultCount++ ))

done

if [[ $upper -gt 0 ]] ; then
    echo "$InsultCount Insults replaced."
else
    echo "Insult file (sudoinsult.txt) does not exist or only has one line." >2
fi

Создать файл данных

Надеюсь, не нужно объяснять, как создать текстовый файл (подсказка: gedit)

$ cat sudoinsult.txt

Just what do you think you're doing Dave?
Just what do you think you're doing Rick?
It can only be attributed to human error.
It can only be attributed to the beer.

Запустите скрипт и проверьте результаты.

$ sudo ./sudoinsult

Replacing: 'Just what do you think you're doing Dave?'
     With: 'Just what do you think you're doing Rick?'
Replacing: 'It can only be attributed to human error.'
     With: 'It can only be attributed to the beer.'
2 Insults replaced.

$ ll /usr/lib/sudo/sudoers{.so,.so.bak}

-rw-r--r-- 1 root root 316768 Nov 14 17:43 /usr/lib/sudo/sudoers.so
-rw-r--r-- 1 root root 316768 Oct 11 06:01 /usr/lib/sudo/sudoers.so.bak

$ grep "Just what do you think you're doing Rick?" /usr/lib/sudo/sudoers.so

Binary file /usr/lib/sudo/sudoers.so matches

$ grep "It can only be attributed to the beer." /usr/lib/sudo/sudoers.so

Binary file /usr/lib/sudo/sudoers.so matches

Связанный контент