新生鳩丸掲示板♯

bakera.jp > 新生鳩丸掲示板♯ > スレッド内全記事表示 (記事 3500 からのスレッド)

スレッド内全記事表示 (記事 3500 からのスレッド)

[3500] Re: 「情報処理試験でNUL文字攻撃の問題など」

F.Koryu (2006年4月18日 10時26分)

初めてココにコメントします。自分も最初は「NUL文字を途中に混入してあければ~」と考えたんですが、何を血迷ったのか別の答えを書いてしまいました。orz

文字列の途中にNUL文字を混入させる攻撃手法ってそんなに知られていないんですかね?

自分はCでプログラムを学んだので「NULL文字(\0)を含む各種制御文字の処理は注意するものだ」という意識でいたんですが……最近の各種言語では文字列を扱うデータ型(ex:String型)が標準で用意され、文字列操作に関する内部処理がブラックボックス化しているというのも「初耳」となる原因の1つなのかもしれないな~、と思ってています。

[3502] Re: 「情報処理試験でNUL文字攻撃の問題など」

ばけら (2006年4月18日 21時57分)

>文字列の途中にNUL文字を混入させる攻撃手法ってそんなに知られていないんですかね?

>自分はCでプログラムを学んだので「NULL文字(\0)を含む各種制御文字の処理は注意するものだ」という意識でいたんですが……

 最近は Perl や PHP から入ってくる人も多かったりして、その辺の知識は意外になかったりするような気がします。そもそも、「C には文字列型がない」という話で「へぇ」と言われたりもしますし……。

# と言っても、私も C はほとんど知らないのですが。

[3506] Re: 「情報処理試験でNUL文字攻撃の問題など」

あきら (2006年4月19日 17時54分)

別解:

パイプを使って,任意ファイルを.cepファイルとしてコピー。

文字数収まらなくて舌足らずにしかかけなかったorz.

#アクセスって意味なら読めなくても書き込めればOK?

[3509] Re: 「情報処理試験でNUL文字攻撃の問題など」

PANDA (2006年4月20日 20時36分)

> Perl の open は NUL を含むファイル名を渡されると NUL 以降を無視します。

Perl の open が NUL 以降を無視するのですか?

私は、OSの API の仕様として「パス名は NUL で終端する(から NUL 以降の部分は無視される)」ようになっているだけで、 Perl に限った話では無いと思います。

パス名として NUL 文字を含めることができるプログラミング言語というのもOSというのも聞いたことがありません。

(Perl のソースを見た訳では無いですが)Perl は単にOSの API を呼び出すために文字列の末尾に NUL を付加しているだけであって、 Perl が NUL 以降を無視しているのではないと思います。

print length("abc\x00def"); の結果は 7 ですから、Perl は NUL 以降を無視していないようです。

で、問題冊子末尾の解説を読んでも「Perl の open 関数における NUL の扱い方」についての説明が無いので解答方法に窮しました。

NUL 文字のことなんだろうなと思いつつも用語が定義されていないので、「パス名の終端文字として認識される文字で$fnameを終端させる」と解答するにとどめました。

[3510] Re: 「情報処理試験でNUL文字攻撃の問題など」

ばけら (2006年4月20日 21時53分)

>Perl の open が NUL 以降を無視するのですか?

 はい。少なくとも事実上「Perl の open は NUL 以降を無視する」と言って良い状況であろうと思います。これは、「Perl は文字列の NUL以降を無視する」ということではありません (後述)。

>パス名として NUL 文字を含めることができるプログラミング言語というのもOSというのも聞いたことがありません。

 確かに含めることができるものは私も聞いたことがありませんが、「NULから後ろを無視する」という動作にならない言語は存在します。たとえば、.NET Framework では、NUL を含むパス名を開こうとすると、ArgumentException がスローされるようになっています。

 それに対して、Perl の open は単に NUL 以降を無視して開いてしまいます。これは仰るように、Perl が単に OS の API をそのまま呼んでいるために結果としてそうなっているのでしょう。

>print length("abc\x00def"); の結果は 7 ですから、Perl は NUL 以降を無視していないようです。

 そのとおりで、これは重要です。なぜかというと、Perl では foo.html(NUL).cep という文字列が /\.cep$/ にマッチしてしまうからです。拡張子が .cep かどうかを正規表現で検査しようとしても、正規表現の書き方によっては回避されてしまうことがあります。「Perl の open は NUL 以降を無視します」が、「Perl は文字列の NUL 以降を無視するわけではない」ということが重要ですね。

>で、問題冊子末尾の解説を読んでも「Perl の open 関数における NUL の扱い方」についての説明が無いので解答方法に窮しました。

 これは確かにそうですね。Perl の open が NUL を拾ったらエラーを返すという実装になっていると仮定すれば、NUL による攻撃はできないですね。

[3511] Re: 「情報処理試験でNUL文字攻撃の問題など」

ばけら (2006年4月20日 22時19分)

>>Perl の open が NUL 以降を無視するのですか?

> はい。少なくとも事実上「Perl の open は NUL 以降を無視する」と言って良い状況であろうと思います。

 ちょっと補足です。

 Perl が文字列の NUL 以降を無視しているわけではないので、「open() に渡った文字列の NUL から後ろが無視される」わけではなくて、「ファイル名のNULから後ろが無視される」ことになります。両者はほぼ同じですが、パイプを使おうとするときに大きな違いが出ます。

open(FOO, "foo\0bar|")

 ではコマンド foo が実行されますが、

open(FOO, "foo|\0bar")

 ではコマンド foo は実行されません。

 このことからも、Perl が NUL 以降を切っているのではなく、単に NUL を含むパスをそのまま OS に渡しているだけだということが伺えますね。

[3516] Re: 「情報処理試験でNUL文字攻撃の問題など」

びい (2006年4月23日 12時0分)

PascalならNUL文字は終端として扱われないので

Path := 'path/to/' + #0 + 'file'

Reset(F, Path)

とかできます。

パス名の扱いはプログラミング言語とは別の世界なので、パス名にNUL文字を入れられるかどうかはOSによりますが、MS-DOSとN88-BASICなら可能だったと思います。

[3517] Re: 「情報処理試験でNUL文字攻撃の問題など」

えむけい (2006年4月23日 17時22分)

>パス名の扱いはプログラミング言語とは別の世界なので、パス名にNUL文字を入れられるかどうかはOSによりますが、MS-DOSとN88-BASICなら可能だったと思います。

MS-DOSでできましたっけ? MS-DOSのファンクションリクエストもNUL文字でパスを終える仕様だった気が。

[3520] Re: 「情報処理試験でNUL文字攻撃の問題など」

びい (2006年4月23日 19時41分)

>MS-DOSでできましたっけ? MS-DOSのファンクションリクエストもNUL文字でパスを終える仕様だった気が。

終端文字は'$'だと勘違いしてました。NULは使えませんね。

[3522] Re: 「情報処理試験でNUL文字攻撃の問題など」

えむけい (2006年4月24日 7時28分)

>>MS-DOSでできましたっけ? MS-DOSのファンクションリクエストもNUL文字でパスを終える仕様だった気が。

>終端文字は'$'だと勘違いしてました。NULは使えませんね。

そういえば'$'で文字列を終えるファンクションもあった気のせいがしてきましたが、ASCIZ文字列【謎】をパラメータに取るファンクションもあったはずです。

今思いつきましたがFCBファンクションとか使うとNULを混入できたりしないでしょうか。

[3525] Re: 「情報処理試験でNUL文字攻撃の問題など」

PANDA (2006年4月26日 21時2分)

話が脱線していますが懐かしい話なので・・・。

> そういえば'$'で文字列を終えるファンクションもあった気のせいがしてきましたが、

MS-DOS の頃には AH=9, DX=「$で終わる文字列へのアドレス」を指定して INT 21H すると文字列を表示できましたね。

最近の日記

関わった本など