パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

+Lhaca 1.21の修正は不十分」記事へのコメント

  • 長らく +Lhaca のユーザーだった者として、 Windows で圧縮ファイルの取り扱いに迷ったらとりあえず +Lhaca デラックス版を入れておけばよいという気楽さを提供してくれた作者の村山富男さんには感謝しています。

    前回の脆弱性 [srad.jp]が見つかるまで +Lhaca 1.20 を使っていましたが、脆弱性への対応の中で

    行ったこと:LHA展開処理内に存在したstrcpyをstrncpyに変更し、バッファーのオーバーフローをなくしました。

    という記述を見て不安を覚えたので、 +Lhaca を使うのをやめました。

    C 言語を知っている人の中には似たような印象を受けた人もいるのではないでしょうか。

    どんなライブラリー関数もそうですが、 strncpy は魔法の関数

    • # 別に貴方が使用中止するのは勝手ですが。

      どんなライブラリー関数もそうですが、 strncpy は魔法の関数ではなく、 strcpy と同様に注意して使わないとセキュリティーホールを生みます。しかも、 strncpy はけっこう間違えやすい関数だということで、「strcpy の安全版」として strncpy を使うことを推奨しない人がたくさんいます。

      strncpyが間違えやすい関数とは?
      伝聞だけで疑心暗鬼に陥り、不安になっているのでしょうか。

      程度問題らしいですが、strcpy_s等よりstrncpyが間違えやすいってのも分からない。
      「LHA展開処理内に存在したstrcpyをstrcpy_sに変更し、バッファーのオーバーフローをなくしました。」なら安心なのか?

      # そもそもバイナリデータならstrcpy/strncpyじゃなくてmemcpy使えよ!と突っ込みたいAC
      • strncpyが間違えやすい関数とは?

        Cはあまり詳しくないのですが、strncpyとstrlcpyで検索してみたところ、
        strncpy(3)よりもstrlcpy(3) [hatena.ne.jp]というタイトルのBLOGエントリーが出てきました。
        曰く、

        strncpy(3)は、(本来文字数を指定するところに)ついうっかりバッファサイズを指定すると、不正なC文字列になってしまうので要注意です。

        だそうで。
        もしこの理由があたっているなら、「ついうっかり」やりやすそうなミスに見えますから、

        • ついうっかりは感覚的にも分かりやすい話ですが、
          C言語は、strなんちゃらという関数だからといって、char型の配列でNULL文字が終端ということの正当性を保障する挙動を示すわけではないし、保障されると使いづらくなる場合もある。
          データ構造に関しての正当性は、あくまで作る人が、割ける範囲のコストで行わなければならない言語なんだ、ということを念頭におけるかどうかじゃないでしょうか。

          推奨として、strlcpyを適切に使うのはありですが、だからといって置き換えればよいってモノでもないってことかと。
          • OpenBSD由来のstrlcpyやstrlcat、glibc由来のasprintf、mallocよりも整数値オーバーフローチェックつきのcallocを使うコード規約にすれば安全になると盲信するのは危険ですが、この規約にすることで確実に攻撃しにくくなっていると思いますよ。プログラマーは必ずミスをしますからついうっかりチェックを忘れたり、ついうっかり'\0'を入れ忘れたりするのは十分ありえることで、その場合でも安全にしておく方が良いと思いますから。

            strlcpyやstrlcatについての詳しい説明は下記の論文にまかせますが、#1183107の引用が気になったのでその点だけ指摘します。
            | strlcpy and strlcat--Consistent, Safe, String Copy and Concatenation,
            | Todd C. Miller and Theo de Raadt,
            | Proceedings of the 1999 USENIX Annual Technical Conference (FREENIX TRACK)
            | http://www.usenix.org/events/usenix99/millert.html [usenix.org]

            #1183107の引用にて、
            | strncpy(3)は、(本来文字数を指定するところに)ついうっかりバッファサイズを指定すると、
            | 不正なC文字列になってしまうので要注意です。
            と説明されていますが、上で紹介した論文のCommon Misconceptionsにある通り、『多くのプログラマーはstrncpyを使うと'\0'が終端記号として入っていることを想定しているが、その想定はコピー元のサイズがコピー先のサイズより小さい場合だけしか正しくない。また、strncpyを使った場合のコストはstrcpyよりも'\0'をつける処理の分高い』とちゃんと書くべきです。バッファサイズを指定するかバッファサイズ-1を指定するかは本質的な問題ではありません。strncpyではコピー元の方がコピー先よりも大きかったら、最後に'\0'が入らないので文字として扱ったときにバッファを越えてアクセスしてしまうというのが問題なわけです。

            親コメント

クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人

処理中...