PDA

Просмотр полной версии : Насколько безопасно использовать CP в bash-сценариях (cmd-injection)


ASMi386
02.03.2024, 19:17
Собственно сабж.
Чтобы не грузить лишним, интересует, насколько безопасен такой фрагмент в скрипте (теоретический кусочек):

Код:



#!/bin/bash
SUFFIX=$(date '+_%d_%m_%Y')
/usr/bin/cp ./from/*$SUFFIX.zip ./to/


Интересует возможность command injection через имя файла.
Файловая система источника NTFS, назначения - ext4
Если возможность существует, как правильно защититься? Кавычками?)

f22
03.03.2024, 10:48
ASMi386 сказал(а):

Интересует возможность command injection через имя файла.


А каким образом по вашему имя копируемого файла должно восприниматься shell'ом как команда?
Он получает строку и эту строку подставляет в путь.



ASMi386 сказал(а):

Если возможность существует, как правильно защититься? Кавычками?)


Если есть сомнения в этом плане, используйте условие
Можно проверить, является ли исходный/конечный путь файлом, или вообще существует ли

Bash:



if
[
[
-f /usr/bin/cp
]
]
;
then
echo
1
;
else
echo
2
;
fi


Bash:



if
[
[
-e /usr/bin/cp
]
]
;
then
echo
1
;
else
echo
2
;
fi

ASMi386
03.03.2024, 10:54
f22 сказал(а):

А каким образом по вашему имя копируемого файла должно восприниматься shell'ом как команда?
Он получает строку и эту строку подставляет в путь.


Может ли злоумышленник на файловой системе NTFS создать такое имя файла, которое позволило бы выполнить команду на бэкап-сервере?

Код:



1.txt /tmp;ls -la;.zip


Очень грубо) Насколько я знаю, NTFS терпимо относится к точкам с запятой в имени файла.

Exited3n
03.03.2024, 13:35
ASMi386 сказал(а):

Может ли злоумышленник на файловой системе NTFS создать такое имя файла, которое позволило бы выполнить команду на бэкап-сервере?

Код:



1.txt /tmp;ls -la;.zip


Очень грубо) Насколько я знаю, NTFS терпимо относится к точкам с запятой в имени файла.


У тебя нет eval'a или прочего, с чего вдруг cp начнет исполнять команды как sh ?

ASMi386
03.03.2024, 14:30
Логично, но думал мало ли у негодяев каких фокусов в запасе - решил уточнить )

Спасибо!

larchik
03.03.2024, 16:12
Exited3n сказал(а):

У тебя нет eval'a или прочего, с чего вдруг cp начнет исполнять команды как sh ?


вообще, на первый взгляд, тут возможна инъекция, но все зависит от конкретной реализации.
Там, где стоит символ '*' - это пользовательский ввод, который может быть любым.
Преположим, что в звездочку попадет конструкция типа test.zip ./to; id; #.
Тогда итоговая строка может быть такой:


/usr/bin/cp ./from/test.zip ./to; id; #$SUFFIX.zip ./to/


Теоретически команда id будет выполнена после копирования. В общем ТС задает правильный вопрос.

Exited3n
03.03.2024, 17:10
larchik сказал(а):

вообще, на первый взгляд, тут возможна инъекция, но все зависит от конкретной реализации.
Там, где стоит символ '*' - это пользовательский ввод, который может быть любым.
Преположим, что в звездочку попадет конструкция типа test.zip ./to; id; #.
Тогда итоговая строка может быть такой:


/usr/bin/cp ./from/test.zip ./to; id; #$SUFFIX.zip ./to/


Теоретически команда id будет выполнена после копирования. В общем ТС задает правильный вопрос.


Проводите тесты! Если время позволяет.

ASMi386
03.03.2024, 17:27
Exited3n сказал(а):

Проводите тесты! Если время позволяет.


Я очевидные варианты пофаззил локально - ничего не вышло. Решил у сообщества уточнить.

UPD: без файла, если явно подсунуть такую конструкцию, создается /tmp/cmd.flag

Код:



#!/bin/bash

rm ./to/*
SUFFIX=1.txt /tmp;touch /tmp/cmd.flag;echo

/usr/bin/cp ./from/$SUFFIX ./to/


Код:



-rw-r--r-- 1 asm asm 0 Mar 3 16:51 cmd.flag


Чуть позже примонтирую NTFS, еще поизвращаюсь))

Exited3n
03.03.2024, 18:29
ASMi386 сказал(а):

Я очевидные варианты пофаззил локально - ничего не вышло. Решил у сообщества уточнить.

UPD: без файла, если явно подсунуть такую конструкцию, создается /tmp/cmd.flag

Код:



#!/bin/bash

rm ./to/*
SUFFIX=1.txt /tmp;touch /tmp/cmd.flag;echo

/usr/bin/cp ./from/$SUFFIX ./to/


Код:



-rw-r--r-- 1 asm asm 0 Mar 3 16:51 cmd.flag


Чуть позже примонтирую NTFS, еще поизвращаюсь))


Тут ты код скрипта правишь непосредственно, можно нагородить что угодно.
Я про другое.