[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