Sudo ソースコードガイド

最終更新: 2024-08-20 10:35:59 +0800 +0800
原文は英語で書かれています。あなたはAI翻訳版を読んでいます。

sudo のソースツリーでは、フロントエンドプログラム、プラグイン実装、再利用可能なライブラリ、生成された言語パーサー、移植性サポートが分離されています。実行可能ファイルのエントリポイントから始め、次にプラグインインターフェースをたどってください。ディレクトリ名だけを手掛かりにツリーを読むと、ポリシーの境界が見えにくくなります。

フロントエンドとコマンドフロー #

src/sudo.c は sudo のフロントエンドです。初期処理では、呼び出しの詳細を確定し、コマンドラインオプションを解析し、設定とロギングを初期化した後、認可と実行に関する判断を設定済みのプラグインに委ねます。フロントエンドは意図的にポリシーから分離されています。ポリシープラグインはコマンドの実行を許可するかどうかを判断し、I/O プラグインは実行の記録や仲介を行えます。

ほかのエントリポイントには、visudo、cvtsudoers、sudoreplay、testsudoers があります。それらのソースは、プログラムごとに独立したディレクトリではなく、共有フロントエンドコードと同じ場所にあります。src/ 内のファイルがすべてのバイナリにリンクされるとは限らないため、呼び出しを追跡する前に、ローカルの Makefile.in で実行可能ターゲットを特定してください。

include/sudo_plugin.h はフロントエンドとプラグイン間の境界を定義します。デフォルトのポリシー実装は plugins/sudoers/ 配下にあります。このツリーには、sudoers の解析、照合、ポリシー判断、ロギング、および関連するプラグインフックが含まれます。I/O のロギングと再生コードも、プラグイン指向の関心事です。移植やポリシーに関する作業では、フロントエンドの権限処理を変更するのではなく、これらのインターフェースから着手してください。

キューマクロ #

include/sudo_queue.h には、BSD 形式の侵入型キューマクロがあります。ノードはエントリー用リンクを内包し、ヘッドは先頭要素に加えて、末尾キューの場合は末尾への参照も保持します。主要なファミリーは、リンク方式と、ヘッドが末尾を追跡するかどうかによって異なります。

ノードのリンクヘッドの構成マクロファミリー
次先頭SLIST_*
次先頭と末尾STAILQ_*
次と前先頭LIST_*
次と前先頭と末尾TAILQ_*

これらのマクロは、割り当て、ロック、ライフタイム管理、型安全なイテレーターオブジェクトを生成しません。キューを使用するコードは、埋め込まれた要素を存続させ、並行する変更を保護する必要があります。BSD 由来のヘッダーは分岐しているため、ホストの <sys/queue.h> よりもローカルヘッダーのマクロとセマンティクスを優先してください。

ライブラリと移植性 #

lib/ には、フロントエンドとプラグインの間で利用される再利用可能なコンポーネントが含まれ、lib/util/ は低レベルのユーティリティーと互換性ルーチンを提供します。後者には、ラッパー、境界を制限した文字列およびパス処理、割り当て用ヘルパー、ロギングサポート、参照カウント方式の文字列、ターゲットプラットフォームに存在しないインターフェースの代替実装が含まれます。include/ の公開宣言によって再利用の境界が明示され、sudo_ 接頭辞は多くの場合、プロジェクト所有のラッパーを示します。

c
# define getdelim(_a, _b, _c, _d) sudo_getdelim((_a), (_b), (_c), (_d))

すべての sudo_ 関数が単純な別名であると想定しないでください。ラッパーは、代替セマンティクス、入力検証、またはプラットフォーム固有の回避策を提供する場合があります。ネイティブの libc 呼び出しに置き換える前に、その宣言と実装を追跡してください。

configure.ac と m4/ の Autoconf プローブは、利用可能なプラットフォーム機能を選択します。ここが、ヘッダー、関数、権限、オペレーティングシステムの動作に関する移植性の境界です。呼び出し側の #ifdef 分岐は、多くの場合、生成された設定結果に起因します。

生成されたパーサーと設定データ #

sudoers プラグインでは、リリースビルドがパーサージェネレーターを必要としないように、生成済みの出力をリポジトリに格納しています。生成済みファイルを編集するのではなく、ソースと出力の関係をたどってください。

生成されるファイル正式な入力
plugins/sudoers/gram.c, gram.hplugins/sudoers/gram.y
plugins/sudoers/toke.cplugins/sudoers/toke.l
plugins/sudoers/getdate.cplugins/sudoers/getdate.y
plugins/sudoers/def_data.c, def_data.hplugins/sudoers/def_data.in

ビルドの開発者向けルールまたは再生成ルールは、設定済みのパーサー、字句解析器、データ生成ツールを実行します。.y、.l、または .in の入力を変更した後は、それらのルールを介して再生成してください。そうしないと、ソースのチェックアウト内で入力と出力が不一致になる可能性があります。パーサーのシンボル接頭辞と再生成の前提条件はビルド設定の詳細であるため、推測したフラグでジェネレーターを実行するのではなく、該当する Makefile.in と configure の出力を確認してください。

調査の進め方 #

ポリシーに関する問題では、plugins/sudoers/ から始め、include/sudo_plugin.h で宣言されたプラグインコールバックをたどってください。コマンドの起動やオプション処理では、該当する src/ のエントリポイントから始めてください。I/O の記録では、I/O プラグインインターフェースと sudoreplay の読み取り処理をたどってください。オペレーティングシステム間の差異については、lib/util/、m4/、configure.ac、および生成された設定ヘッダーを検索してください。

上流の sudo ソースツリーとリポジトリに格納されたビルドファイルが正式な対応表です。生成される名前とプラグイン構成はリリース間で変化するためです。

コメント

GitHub で閲覧・コメントする(投稿にはログインが必要です)