>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 による攻撃はできないですね。