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

OpenBSD 20周年、5.8 リリース、sudoに代わる「doas」コマンドやpledgeセキュリティシステム導入」記事へのコメント

  • pledge (スコア:5, 興味深い)

    by Anonymous Coward

    pledge は流行ると思いますか?

    まず pledge がどういうものかを説明します。
    プログラムって、最初は設定ファイルを読んだり一時ファイルを開いたりするけど、
    その後メインループに入ったら権限を殆ど必要としないことが多いですよね。
    だから、 コマンドラインオプション等に応じて [openbsd.org]
    メインループ直前で権限を落とすという仕組みなんです。

    だから最初は tame (調教する [openbsd.org]) という名前の関数でした。
    獰猛な野獣 (いったん任意のコマンド実行を許す脆弱性があると何でもできちゃう) を
    手なずける (脆弱性があっても殆どのシステムコールが実行不可能) という感じですね。

    現在では主語が変

    • by annoymouse coward (11178) on 2015年10月22日 18時01分 (#2904832) 日記

      > tame(TAME_STDIO | TAME_CMSG | TAME_GETPW | TAME_PROC | TAME_DNS, NULL);
      >というインターフェースにするのが普通の発想じゃないかと思うんですが、この pledge は
      > tame("stdio cmsg getpw proc dns", NULL);

      後者の方が,今風のAPIだと思います

      理由は3つ

      1) 後者のほうが短い(≒可読性も高い)

      古典的なC言語だと
      tame(TAME_STDIO | TAME_CMSG | TAME_GETPW | TAME_PROC | TAME_DNS, NULL);
      はよく見かける記述ですが,これ冗長だと思いませんか?

      2) 今時のCPUは高速なので,文字列処理は大したオーバヘッドにならない

      特に tame() は頻繁に実行する処理ではないので,文字列処理のオーバヘッドはあまり問題になりません

      3) 文字列のほうが拡張性・保守性が高い

      カーネルのAPI/ABIでは,将来的な変更・修正が少ないことも重視されます

      ヘッダで定数のORを取る方針だと,たとえば64bit整数だと最大64個しかオプションが定義できません.
      65個目のオプションが必要なった場合は API/ABI を追加,または変更しなければなりません.そのため細かい制御には不向きであると言えます

      一方文字列で指定する方針だと,API/ABIを保ったまま柔軟な拡張ができます.
      たとえば
      tame("get*", NULL);
      tame("getpw[uid==1000]", NULL);
      などです.

      この手の拡張は,定数でOR作戦だと実質無理です.

      個人的には,3番目の理由だけで,私は定数をORで指定する方式は選択肢にさえなりません

      親コメント
      • by hetareDAIO (17407) on 2015年10月22日 19時36分 (#2904878) 日記

        個人的には,3番目の理由だけで,私は定数をORで指定する方式は選択肢にさえなりません

        ですねぇ。加えて言うと、文字列なら他の言語との親和性も高くなりますしね。ヘッダファイル等での余計な定義も不要になりますし。

        --
        ほえほえ
        親コメント
      • by Anonymous Coward

        それでも文字列はないな。考慮しなきゃならないケースが無駄に多くなりすぎる。
        それはバグの温床だし、すなわちセキュリティホールの温床にもなりうる。
        それに理由3は割と簡単にあとから拡張可能だしね。

      • by Anonymous Coward

        文字列の方が拡張性が高いのはわかるんですが、保守性も高いんでしょうか?

        プリコンパイルやリンクでチェックやリンクできずにエラーになるならいいと思うんですけど、
        実行時にしかエラーがわからなさそうなものってどうにも抵抗が…
        (javaや.NETのリフレクションで文字列指定するのとかも抵抗があるんですよね。あっちはIDEのリファクタリング機能の対象外になるのも敬遠したくなる所以ですが)。

        優秀なIDEがあればコードtypoなんかは警告だしてくれそうですが、それもあるかどうか不明ですし。
        実際に作る時はマクロでもつかってそのあたりの不安を埋めてくんでしょうかね?

        # 最近jsばかり書いてるせいか、どうせ文字列つかうなら文字列テーブルにすればいいのにとも。

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

処理中...