Dl when $SAFE = 1

こんにちは、sheepman です。

$SAFE=1のときの dl ライブラリの振る舞いに関してです。

require ‘dl’
$SAFE = 1
h = DL.dlopen(nil)
sys = h.sym(‘system’, ‘IP’)
uname = ‘uname -rs’.taint
sys[uname]

という感じで、汚染されている文字列を引数として system を呼べてしまいます。
というわけで、パッチを書いてみました。

DL.dlopen の引数も SafeStringValue でチェックするようにしました。

dl のコードを読むと、String#to_ptr はもとの文字列が汚染されていなくても、常に汚染された
PtrData を返すので、 PtrData.new も常に汚染されたオブジェクトを返すようにしています。

このパッチは後方互換がないので、検討が必要だと思います。

sheepman wrote:

e$B$H$$$&46$8$G!“1x@w$5$l$F$$$kJ8;zNs$r0z?t$H$7$Fe(B system e$B$r8F$Y$F$7$^$$$^$9!#e(B
e$B$H$$$&$o$1$G!”%Q%C%A$r=q$$$F$_$^$7$?!#e(B

e$B$^$:;O$a$K!“0JA0$N;d$N9M$($H$7$F$O!“e(Bsysteme$B$r8F$S=P$9e(Brubye$B$N%i%$%V%i%jB&$G$Ne(B
e$B%A%’%C%/$,K>$^$7$$$H;W$C$F$$$^$7$?!#e(Bdle$B$O!“3HD%%i%$%V%i%j$r=q$/Be$o$j$Ke(Bruby
e$B$Ge(BAPIe$B$X%”%/%;%9$9$k$3$H$r9M$($F:n$C$?$b$N$G$9$N$G!”$=$Ne(BAPIe$B$X%”%/%;%9$9$ke(B
rubye$B$N%W%m%0%i%`$d%i%$%V%i%j$,e(BSAFEe$B$N%A%’%C%/$r$9$k$N$,NI$$$N$G$O$J$$$+$H9Me(B
e$B$($F$$$^$7$?!#e(B

e$B$7$+$7!"e(Bdle$B$OFC<l$J3HD%%i%$%V%i%j$G$9$7!"e(Bdle$B$r4m$J$$%W%m%0%i%$G$O30ItF~NO$Ke(B e$B0MB8$9$k$h$&$K$O;H$o$J$$$H$$$&9M$($N2<$G$O!"$"$i$f$kA:n$r6X;_$9$k$H$$$&$Ne(B
e$B$bF10U$G$-$^$9!#e(B

e$B$5$F!"e(Bsysteme$B$NNc$G$9$,!“e(Bsysteme$B$N8F$S=P$7$=$N$b$N$Oe(Btainte$B%A%’%C%/$NBP>]$G$9!#e(B
e$B4m$J$$4X?t$,;H$o$l$k>l9g$K$O%A%’%C%/$,$+$+$k$O$:$G!”$=$N$H$-$K$OF1;~$K0z?te(B
e$B$N%A%’%C%/$b9T$($PNI$$$H9M$($k$3$H$b$G$-$k$H;W$$$^$9!#e(B

dlopene$B$K$D$$$F$Oe(Bdlopene$B$K$h$C$F2?$,4m81$K$J$k$N$+$N5DO@$,I,MW$@$H;W$$$^$9!#e(B

e$B0J>e$N$3$H$+$i!"e(Bsysteme$B$He(Bdlopene$B$N7o$O$I$l$,E,@Z$J$N$+;d$K$OH=CG$G$-$^$;$s!#e(B

malloce$B$K$h$C$FF@$?%%V%8%’%/%H$,e(Btaintede$B$G$"$k$Y$-$+$I$&$+$K$D$$$F$O!"$9$Y$Fe(B
e$BDj?t$+$i9=@.$5$l$?%
%V%8%’%/%H$b4m81$@$H$9$Y$-$J$N$+$H5?Ld$,$"$j$^$9!#e(B
e$B$=$N8e$NCf?H$NJQ99$Ge(Btaintede$B$K$7$J$1$l$P$J$i$J$$>l9g$,$"$j$=$&$J$3$H$OA[A|$Ge(B
e$B$-$^$9$,!“e(Ballocatee$B$NCf$Ge(Btaintede$B$K$9$kM}M3$O$I$3$K$”$k$N$G$7$g$&$+!)e(B

e$B$3$s$K$A$O!"e(Bsheepman e$B$G$9!#e(B

On Mon, 19 Mar 2007 03:59:37 +0900
Takaaki T. [email protected] wrote:

dlopene$B$K$D$$$F$Oe(Bdlopene$B$K$h$C$F2?$,4m81$K$J$k$N$+$N5DO@$,I,MW$@$H;W$$$^$9!#e(B

e$B0J>e$N$3$H$+$i!"e(Bsysteme$B$He(Bdlopene$B$N7o$O$I$l$,E,@Z$J$N$+;d$K$OH=CG$G$-$^$;$s!#e(B

e$B!V3HD%%i%$%V%i%j$,Ds6!$9$Y$-%;%-%e%j%F%#$O2?$+!W$J$I$r9M$($k$HE%>B$K%O%^$C$Fe(B
e$BEz$,=P$J$$$N$G!"e(Bruby e$BK\BN$,$d$C$F$$$k$3$He(B
http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=���������ƥ����ǥ�
e$B$K9g$o$;$k$3$H$,!"3+H/<T$K$H$C$F$b%f!<%6$K$H$C$F$bJ,$+$j$d$9$$$s$8$c$J$$$+$J$H!"e(B
e$BKM$O;W$$$^$9!#e(B

malloce$B$K$h$C$FF@$?%%V%8%'%/%H$,e(Btaintede$B$G$“$k$Y$-$+$I$&$+$K$D$$$F$O!”$9$Y$Fe(B
e$BDj?t$+$i9=@.$5$l$?%
%V%8%'%/%H$b4m81$@$H$9$Y$-$J$N$+$H5?Ld$,$“$j$^$9!#e(B
e$B$=$N8e$NCf?H$NJQ99$Ge(Btaintede$B$K$7$J$1$l$P$J$i$J$$>l9g$,$”$j$=$&$J$3$H$OA[A|$Ge(B
e$B$-$^$9$,!“e(Ballocatee$B$NCf$Ge(Btaintede$B$K$9$kM}M3$O$I$3$K$”$k$N$G$7$g$&$+!)e(B

e$BN)@P$5$s$,=q$+$l$?%3!<%I$+$iN)@P$5$s$N0U?^$r?dB,$7$?7k2L$G$9!#e(B
e$B$=$l0J30$NM}M3$O$"$j$^$;$s!#e(B

String#to_ptr e$B$He(B Array#to_ptr
e$B$,%;!<%U%l%Y%k$K$h$i$:!“$^$?JQ49A0$Ne(B
e$BJ8;zNs$dG[Ns$,1x@w$5$l$F$$$k$+$I$&$+$K0MB8$;$:!”>o$K1x@w$5$l$?e(B
PtrData e$B$re(B
e$BJV$7$F$$$?$N$G!“e(BPtrData.new
e$B$b$=$l$i$K9g$o$;$F>o$K1x@w$5$l$?%*%V%8%'%/%H$re(B
e$BJV$7$?J}$,$$$$$N$+$J$”$H$$$&!"7Z$$5$;}$A$G$9!#e(B