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

qmailにバッファオーバーフローの脆弱性」記事へのコメント

  • qmailのソースが (スコア:3, おもしろおかしい)

    by Anonymous Coward on 2004年01月19日 23時41分 (#476372)
    すごい!!という話をどこかで聞いたので
    ちらっと見てみたら確かにすごい!!

    適当に開いてみたtcpto.cの96行目当たりから

    lastwhen = (unsigned long) (unsigned char) record[11];
    lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[10];
    lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[9];
    lastwhen = (lastwhen << 8) + (unsigned long) (unsigned char) record[8];
    when = now();

    プログラミング初心者の私がいうのも何なんですが
    よくこんな書き方で穴がないもんだ…。
    マジックナンバーのオンパレードだし、コメントはさっぱりないし。

    作者は天才なんだろうなぁ。
    • その他の例 (スコア:3, 参考になる)

      by shadowfire (6584) on 2004年01月20日 5時10分 (#476584) ホームページ
      私には無理やり1行で書こうとするソースが目に付きます。
      例えば、qsmhook.cの
      void die(e,s) int e; char *s; { substdio_putsflush(subfderr,s); _exit(e); }
      とか。なんでこんなにしてまで1行にしなきゃいけないんだろう。
      難読プログラムコンテストにでも出す気なのか?
      これ(qmail-smtpd.c)なんて
      void straynewline() { out("451 See http://pobox.com/~djb/docs/smtplf.html.\r\n"); flush(); _exit(1); }
      読みにくいのもそうだけどサイトのURLが変わったらどうすんのよ。
      それだけでバージョンアップ?

      他に気になる点は
      • インデントがスペース1つだったり2つだったり、4つ以上になるとスペース4つとタブが入り混じって読みにくい。やっぱり難読コンテスト上位を目指しているのか?
      • 上記のURLのように、メッセージが全部ソース埋め込み
      • switch-case文でcaseに使われるマジックナンバーの説明コメントが全然無い。
      など。
      databytes関連で、こんな個所もありました。
      if (databytes) if (!bytestooverflow) { out("552 sorry, that message size exceeds my databytes limit (#5.3.4)\r\n"); return; }
      複数のif文まで1行ですか。はあ。

      --
      --------------------
      /* SHADOWFIRE */
      親コメント
      • by Anonymous Coward on 2004年01月20日 8時28分 (#476639)
        英語が母国語の人は、この「1行詰めこみコード」が、それを読む場合に「英文」に見えるんですよ。そう見えるように書いてあるわけ。

        日本人から見ると、構造化もへったくれもないただの汚いコードにしか見えない、ということなんだよ。

        だから、このコードを英語があまりうまくない日本人が書いたとしたら、批判は当たりと思うよ。
        親コメント
        • そんなあなたはCOBOLerですか(笑)
          ヨタ話とか思えないけど、もし本気で言っているのなら、論理記述言語と
          自然言語についてもうちょっと勉強したほうがいいと思うよ。
      • by TxG (7966) on 2004年01月21日 1時29分 (#477668)
        普通の関数は一行で書いたりはしてない気がしますが…(それより僕にはマクロの方が深刻でした…)

        if( x ) if ( y ) { ... }

        って if( x && y ) { ... }

        と同じじゃないんでしょうか(マクロで書くなら気をつけなきゃいけませんが)。
        スタンダードではないですがある意味深いカッコがへっていいような気もするので、少なくとも「スタンダードでないからダメ」以外の理由でそんなに理に叶っていないとか特別に読みにくいコードには見えないです。

        # でも僕は決してif( x ) if( y ) なんて書きませんよ

        脆弱性発見とかいうトピックで、こんなにソースを見ている人がいるのかと思ってびっくりです。

        ---
        飲酒済みにつき乱筆御容赦。
        親コメント
        • by gk-hyn (7889) on 2004年01月21日 10時54分 (#477843)
          elseをつけるとき意味が違ってくるから同じ、というわけでもないのでは?
          親コメント
        • by Anonymous Coward
          > if( x ) if ( y ) { ... }

          > って if( x && y ) { ... }

          > と同じじゃないんでしょうか(マクロで書くなら気をつけなきゃいけませんが)。

          上のコードではxの評価が必ずyの評価よりも先になります。下の場合はどちらの評価が先になるか分かりません。
          • by Anonymous Coward
            そんなことはないでしょう。
            if (p && p->x) { ... }
            と書けないことになるじゃないですか。
            • by shiba (273) on 2004年01月21日 12時04分 (#477894) ホームページ
              >if (p && p->x) { ... }
              >と書けないことになるじゃないですか。

              C言語の場合,
              結合規則(?)で「 x && y && z は, ( x && y ) && z と評価する.」とはあるけど,
              「 && は,左オペランドを先に評価する.」と決まってました?

              # if( x ) if( y ) { ... }
              # と書けば,必ず x が先に評価されてから y が評価されるので,
              # 評価の順番が明確になります.
              親コメント
              • by Anonymous Coward
                #477795じゃないですが
                > C言語の場合,
                >結合規則(?)で「 x && y && z は, ( x && y ) && z と評価する.」とはあるけど,
                >「 && は,左オペランドを先に評価する.」と決まってました?

                決まっている [catnet.ne.jp]らしいですね。
                まあ、私的には書き方なんてどうでもいいと思いますが。
              • by Anonymous Coward
                ふつ~、順番を明確にしたいのなら()を使います。
              • by shiba (273) on 2004年01月21日 17時35分 (#478082) ホームページ
                >決まっている [catnet.ne.jp]らしいですね。

                && || ,(カンマ) と ?:(3項演算子) は,特例か...気をつけないと.
                親コメント
              • by IKEDA Kenji (4659) on 2004年01月22日 7時23分 (#478464)

                順もさることながら、不要になった時点で評価を止めてしまうというのも大事です。 たとえば if (x1 && y)x1 が偽の場合、if (x2 || y)x2 が真の場合などでは、y は評価されません。

                こういう仕様最近ではあたりまえですが、C言語以前では、最後まで必ず評価されてしまうものや評価されるされないが実装でバラバラなので「されてしまう」ことを前提にコーディングしなきゃいけないもの、なんてのがゴロゴロしていました。なので、この部分を明確にしていた Cという言語は私には画期的に思えたものです。

                親コメント
      • by Anonymous Coward
        > 読みにくいのもそうだけどサイトのURLが変わったらどうすんのよ。

        そのためのpobox.comなんじゃなくて?
        # まあ、pobox.com自体が消滅する、という可能性もないわけではないが。
        • by Anonymous Coward
          そもそもURLをハードコーディングするセンスが…ってことでそ。
          Makefileに書くなり、djb的文法でもconf-hogehogeっていうのも
          あるのに。
      • by Anonymous Coward
        難読プログラムコンテストにでも出す気なのか?

        DJB は IOCCC Winner [ioccc.org] です。

    • Cは文学だねぇ (スコア:2, フレームのもと)

      by Futaro (2025) on 2004年01月20日 3時22分 (#476563) ホームページ 日記
      Cはいろいろな思想の人がいろいろなやりかたでけっこう自由に「表現」できるところがいいところでもあると思うのですよ。他人の書いたコードを見て、ああ、彼はこの部分ではこんなことを大切にしてコード書いてるんだな、とか言うのが見えるようになれば、Cのプログラム書きとしては本当に一人前と思うのですよ。

      で、「ここではこんなことを大切にして書く」というところが重要で、その「大切にしてるもの」が、そのコードでなぜ大切なのか?ということにちゃんと理由があるわけ。自分の書いたコードや自分が大切と思っていることしか強調できない「コドモ」は、所詮その程度のプログラミングの能力しかないんだよね。経験上、だけど。

      ハードウエアの動きも頭の中でちゃんとできていて、それを考慮に入れたこの人のコードは、出来の良い文学の1つを読むみたいですよ。その文学が気に入るかどうか、ということとは別にね。

      だから、今でもなかなか穴がみつからない完成度の高さを持っているわけで。

      物事を自分がいま見える方向からだけ見て評価して、それを絶対と思っちゃだめよ。コードを通してその人の考えていることや人柄やコードを書いたときの体調まで見通せるくらいにならないと。

      精進してくらはいね。
      親コメント
      • Re:Cは文学だねぇ (スコア:2, おもしろおかしい)

        by kamogawa (9923) on 2004年01月20日 9時52分 (#476720) ホームページ 日記
        >コードを通してその人の考えていることや人柄やコードを書いたときの体調まで見通せるくらいにならないと。

        なるほど。俺がなぜいつまでたってもダメプログラマなのか
        やっと分かりました。
        プログラミングの勉強する前に、プロファイリングを
        修めてきますよ。
        親コメント
    • ここだけ見ると、読みやすくて解かり易く
      ほとんどのCPUアーキテクチャで正しく動作する
      良いプログラムに見えます。

      エンディアンの問題とかメモリーのアクセス制限に引っかかることも
      なさそうで、良く考えて作ってるなと思いますよ。
      親コメント
      • by cassandro (6035) on 2004年01月20日 0時20分 (#476424)
        > 良いプログラムに見えます。

         うーん、そうですかねえ。プログラミング/アルゴリズムのお勉強の初歩の初歩、総和の計算を思い出してしまいました。sum=5+4+3+2+1というの。

         DJBはライブラリ関数を信じないそうで、qmailにはその代替のサブルーチンを大量に含んでいます。だけど、微妙にライブラリ関数と引数並びが異なったり、中で初心者がやりそうなコードがあったりと、あまり人様に見せて誇れるコードでは無い様な。#476402のAC氏も述べているコンパイル時に警告が多発するのも、オーソドックスなコード書きからは外れてますし。
        親コメント
        • 綺麗でちょくちょく脆弱性が見つかるのと、
          多少クセがあって素人くさい不思議なソースで脆弱性がないもの
          どっちがいいの?
          なんくせ付けてる人はさぞ綺麗で脆弱性がないソース書きの人なんだろうね。
          • by cassandro (6035) on 2004年01月20日 1時56分 (#476510)
            > 綺麗でちょくちょく脆弱性が見つかるのと、多少クセがあって素人
            > くさい不思議なソースで脆弱性がないものどっちがいいの?

             それは、尾籠な話ながら、固形の排泄物味のカレーとカレー味の固形の排泄物のどちらが食べたい?な質問ですね。

             そのどちらもヤ!がボクの答、カレー味のカレーが良いですし、綺麗で脆弱性が無いのが良いでしょう。綺麗である事(論理構造がはっきりしていて読み易い、実行速度とオブジェクト量のバランスが取れている)事と脆弱性が無い事とは、相反する概念ではありませんよ。

            # 綺麗だと検証が楽ですしね。(笑)
            親コメント
            • 綺麗の基準ってなんでしょね・・・。
              いろいろ書けるんですが、読めない奴が読めないといってしまうとそれは綺麗なつもりでもそうではないコードになってしまう・・・。
              • Perlとかすごい人の書いたコードはすごいですね。あれはあれできれいらしいですが僕には解説が必要です(笑)。

                qmailも…うーん。ソースをいじったことはあるんですが、書き方よりも独自Cライブラリのなれの問題かもしれません。

                ライブラリを自分で追ったことがあるんですが、あれは割と苦行でした。
                # 関数の実体を作るマクロ、こまごました(古い)最適化、ループの展開etc…

                よくこれでバグなく動くなぁというのと作者が天才なんだろうなぁというのは僕も同感だったりします。
                親コメント
              • >よくこれでバグなく動くなぁというのと作者が天才なんだろうなぁというのは僕も同感だったりします。

                実はコードがあまりにアレなので、バグの検証をしようという人がいないから長期間バレてないってだけだったりして。

          • 他の人も指摘してるけど、あなたの意見は極端。
            もしかして信者の方かな?
            (素でそんなこと言ってるとしたら怖い)

            まあ、付け加えるなら「メンテナンス性」は大事だよ。
            可能な限り綺麗で脆弱性がないソースを書くのが理想。
            無理ならコメント等で可読性を上げるのも手段の一つ。

            人に説明するのが上手な人ほど物事の本質を捉えるのが上手。
            それができないのは「オレ様が分かればOK」な思想の産物だし。
            (まあ、大体はそれは「分かってない」ことと同義なんだけど)
            親コメント
          • あんまり綺麗じゃないのに脆弱性が全然ないのがすごい、
            という話なのにどうしてそういう反応になるの?
            誰が難癖つけているの?
    • Re:qmailのソースが (スコア:1, すばらしい洞察)

      by Anonymous Coward on 2004年01月20日 0時01分 (#476397)
      > よくこんな書き方で穴がないもんだ…。

      フリーソフトって素人臭いコーディングが非常に多いんだけど、qmailって群を抜いてへんてこなコーディングなんだよねえ。悪いコード例、「絶対にこんな書き方をしてはいけない」の強力な実例として引き合いに出される場合もけっこうあったりして。

      # まあ、うごきゃ良いってのはそうなんだが、
      # このD. J. Bernsteinって人は、教育者だった事 [cr.yp.to]も
      # あったりするんだよね。
      親コメント
      • by Anonymous Coward
        このコメントにマイナスモデした人は、きっとqmailのソースを知らないんだ。
        悪いコード例かどうかはともかく、「普通じゃない」のは確かだ。
      • by Anonymous Coward
        採用するフリーソフトウェアの定義にもよるが、qmailはフリー
        ソフトウェアではないような気がするので、へんてこなコーディング
        でも問題ないんじゃないでしょうか。自分が書いたコード以外
        を信じないような人な
        • by uchida-t (14803) on 2004年01月20日 11時39分 (#476852)
          今やSMTP-AUTHやv6やTLSへの対応などの機能拡張が必須に近くなって
          いるのに、djbはまったく対応しようともしないので、結果パッチが乱立。
          というわけで、djbにオーソライズされていないコードを利用せざるを
          得ないのでは、セキュリティの確保とは正反対の方向に行っています。

          また、各パッチを矛盾なくうまく当てようとするにはコードを読む必要が
          あるのにもかかわらず、あのコードは…。
          親コメント
          • 今やSMTP-AUTHやv6やTLSへの対応などの機能拡張が必須に近くなっているのに、djbはまったく対応しようともしない

            まぁ,djb 先生は IPv6 に否定的 [cr.yp.to]みたいですから,v6 patch が必要な状態はまだまだ続くでしょう.
            # 個人的には我が家に IPv6 のアドレスがちゃんと配られることをまず希望.

            親コメント
    • by Anonymous Coward on 2004年01月20日 0時01分 (#476399)
      この書き方の何が変なんでしょう……
      エンディアンに左右されずに4bytesな整数を扱いたいだけですよね。
      Cで書けばこんな表現日常茶飯事のような。
      # 関数使え or マクロ定義しろ って話?

      最近はJavaしか知らない方が増えているらしいですけど、
      そんな方から見ると、確かに異様なのかもしれませんが……
      親コメント
      • by Anonymous Coward
        >関数使え or マクロ定義しろ って話?

        単純にそう思いました。

        職人技が多数盛り込まれててすごいですよね。
        元コメントも別に嫌味ではないつもりです。
        驚きの世界があるなぁ、というだけで。
        • Re:qmailのソースが (スコア:2, すばらしい洞察)

          by miri (12057) on 2004年01月20日 1時31分 (#476488) 日記
          >職人技が多数盛り込まれててすごいですよね。

          素人が職人技を見てもそれがすごいことだとは必ずしも解らない、というのはプログラミングに限った話ではないとは思いますが、自分が使えればいいだけの職人技は後継者がいなければ廃れていきます。

          それの何がすごいのか、他の方法の何がいけないのか、それを習得するための方法などがわかりやすく整理されていないことが、良いものではなく普及したものが残っていくということに拍車をかけているのだと思います。
          親コメント
    • by Anonymous Coward on 2004年01月20日 0時03分 (#476402)
      DJB氏のソースには独特の味がありますな。
      コンパイルすると警告でまくるしね。
      親コメント
    • Re:qmailのソースが (スコア:1, おもしろおかしい)

      by Anonymous Coward on 2004年01月20日 0時57分 (#476452)
      この程度でガタガタぬかすんじゃない! djbdnsはなぁ、
      if (dns_domain_equal(d,"\0011\0010\0010\003127\7in-addr\4arpa\0")) {
      なんてコードがてんこ盛りだ!! (泣
      親コメント
    • Re:qmailのソースが (スコア:1, おもしろおかしい)

      by Anonymous Coward on 2004年01月20日 1時18分 (#476475)
      C言語=高級アセンブラの説を体現しているようなソースだ...
      親コメント
    • by Anonymous Coward on 2004年01月20日 2時06分 (#476525)
      しかも、djb productは機能拡張なにそれ?なポリシーのおかげで、いまや様々
      なpatch当てが必須なのにも関わらずこういうコード。なのでdjbなコード
      を見てなんじゃこりゃ~と嘆く人が増えるんだろうなぁ。ライバル(というと
      なんだけど)のWietse Zweitze Venema氏のコードと比較しちゃうとなおさら…。
      親コメント
    • by Anonymous Coward on 2004年01月20日 5時19分 (#476586)
      逆に、このソースを読め!というくらい
      美しかったり面白かったりするソフトウェアを思いつく人は教えてほしいなー。

      難解Cプログラムコンテストは面白い。けど、逆方向で。
      親コメント

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

処理中...