[devel] find-package: implemented protection against shell metacharacters and evil paths
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Сен 10 13:34:53 MSD 2007
On Sun, Sep 09, 2007 at 10:54:03PM +0400, Alexey Tourbin wrote:
> В пакете имеется всего один скрипт вида
> #!/bin/sh
> /usr/bin/*
>
> Шелл-анализатор считает "/usr/bin/*" командой (не отсеивает глоб):
>
> $ sh --rpm-requires -c '/usr/bin/*'
> executable(/usr/bin/*)
> $
>
> В таком виде это поступает на вход в shell.req. Из-за того, что старый
> (текущий) shell.req не работает в режиме -f, то там при определенной
> попытке разбить все полученные из --rpm-requires зависимости на слова
> выполняется реальный шелл-глоб:
>
> # Find requires
> found="$(FindReqs $reqs)"
>
> Здесь $reqs не только разбивается на слова, но и выполняется глоб,
> то есть /usr/bin/* среди $reqs фактически раскрывается во все-все
> файлы в /usr/bin. После этого запускается поиск зависимостей на все-все
> файлы в /usr/bin.
>
> Новый (мой not yet) shell.req работает в режиме -f, поэтому появляется
> неудовлетворенная зависимость на /usr/bin/* (sic!).
Update of /people/at/packages/rpm.git
Changes statistics since common ancestor `4.0.4-alt77-70-g9196764' follows:
scripts/find-package.in | 12 +++++++++---
scripts/shell.req.in | 3 ---
2 files changed, 9 insertions(+), 6 deletions(-)
Changelog since common ancestor `4.0.4-alt77-70-g9196764' follows:
commit 2b1c36538fafa3b9daea6334a304b963995ef9fd
Author: Alexey Tourbin <at на altlinux>
Date: Mon Sep 10 13:26:52 2007 +0400
find-package: implemented protection against shell metacharacters and evil paths
There are two possibilities for protection:
1) we should protect at least from very evil shell metacharacters,
like [$*], and also from [:cntrl:] (e.g. newline).
2) we can provide an exhaustive list of characters that are valid
for non-evil pathnames and commands, and issue mandatory warning
if the command or path appears to be evil.
I chose the latter approach.
Valid character range is 'A-Za-z0-9/@=.,:_+-'.
Note that (almost) all files from our base build system
are valid paths:
$ valid='A-Za-z0-9/@=.,:_+-'
$ hsh-run -- rpm -qal |grep "[^$valid]"
/usr/bin/[
/usr/share/man/man1/[.1.bz2
(contains no files)
(contains no files)
$
Later we'll see if the range of valid characters needs to be extended.
Full diff since common ancestor `4.0.4-alt77-70-g9196764' follows:
diff --git a/scripts/find-package.in b/scripts/find-package.in
index 3971d48..eb0333a 100755
--- a/scripts/find-package.in
+++ b/scripts/find-package.in
@@ -272,15 +272,21 @@ FindPackage()
local f="$1" r; shift || return
for r; do
local Verbose=Verbose
+ # Only these characters are allowed for pathnames or commands:
+ valid='A-Za-z0-9/@=.,:_+-'
case "$r" in
+ /*[!"$valid"]*)
+ Info "$f: invalid pathname: $r" ;;
/*)
FindByPath "$f" "$r" ;;
*/*)
- Info "$f: invalid pathname $r" ;;
+ Info "$f: invalid pathname: $r" ;;
-*)
- Info "$f: invalid command $r" ;;
+ Info "$f: invalid command: $r" ;;
+ *[!"$valid"]*)
+ Info "$f: invalid command: $r" ;;
'')
- ;;
+ Verbose "$f: empty command?"
*)
FindByName "$f" "$r" ;;
esac
diff --git a/scripts/shell.req.in b/scripts/shell.req.in
index 5cb790b..28611b5 100755
--- a/scripts/shell.req.in
+++ b/scripts/shell.req.in
@@ -61,9 +61,6 @@ ShellReq()
dname=${f#${RPM_BUILD_ROOT-}}
dname=${dname%/*}
for r in $reqs; do
- if [ -z "${r/*\$*}" ]; then
- continue
- fi
case "$(type -t -- "$r")" in
alias|keyword|function|builtin)
continue ;;
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20070910/9f22fb01/attachment-0002.bin>
Подробная информация о списке рассылки Devel