
自動生成された研究アーティファクト — 上流プロジェクトではありません。
このリポジトリは、ラヴァル大学の修士論文のために、公開されたGitHub Actionsワークフローの脆弱性を再現する目的で自動化ハーネスによって構築された使い捨てラボです。これは
NationalSecurityAgency/emissaryのコミット898488b489615581ea66d17954742c8e4ffb0323(2026-01-09)の逐語的スナップショットであり、そのプロジェクト自身のライセンスの下で再配布されており、そのライセンスファイルはこのスナップショットに変更なしで含まれています。上流プロジェクトは関与しておらず、決して標的にはなりません。ここで研究されている脆弱性はすでに公開されています。このリポジトリ内のすべてのシークレットと変数はランダムに生成されたダミー値であり、実際の認証情報は存在しません。アクション参照とランナーイメージは、2026-01-09時点で解決されたものに固定されています。スナップショットに加えられたすべての変更については、ハーネス出力の
pinning.mdを参照してください。質問や異議がある場合: [email protected]

Emissaryは、P2Pベースのデータ駆動型ワークフローエンジンであり、異種混在の、場合によっては広く分散された多層P2Pコンピューティングリソースネットワーク上で動作します。ワークフローの旅程は従来のワークフローエンジンのように事前に計画されるのではなく、データについてより多くの情報が判明するにつれて発見されます。Emissaryのワークフローには通常、ユーザーの操作はなく、データは完了状態に達するまで目標指向の方法で処理されます。
Emissaryは高度に設定可能ですが、この基本実装ではほとんど何も行いません。このフレームワークのユーザーは、emissary.core.IBaseDataObject ペイロードに対して処理を実行する emissary.place.ServiceProviderPlace を拡張するクラスを提供することが期待されています。
ワークフローの指示を担当するクラスは、emissary.core.MobileAgent とそれから派生したクラスであり、関連するペイロードオブジェクトのセットのワークフローを通る経路を管理します。また、emissary.directory.DirectoryPlace は利用可能なサービス、そのコストと品質を管理し、P2Pネットワークの接続を維持します。
必要なコンポーネントのインストール、ソースコードの取得、Emissaryのビルドと実行に関する情報については、DEVELOPING.md ガイドをお読みください。
Emissaryをコンパイル、テスト、パッケージ化するには mvn clean package を実行します。
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 9.132 s
[INFO] Finished at: 2022-01-10T22:31:05Z
[INFO] ------------------------------------------------------------------------
Emissaryにはすべてを実行するbashスクリプトが1つあります。これはEmissaryの最上位ディレクトリにあります。このスクリプトは、さまざまな機能を処理するための複数の Picocli コマンドを持つ emissary.Emissary クラスを実行します。
emissary スクリプトを引数なしで実行すると、すべての設定サブコマンドの一覧と簡単な説明が表示されます。
./emissary
./emissary help を実行すると、引数なしで実行した場合と同じ出力が得られます。コマンドのより詳細な情報を確認したい場合は、helpの後にコマンド名を追加してください。たとえば、server コマンドの説明付きのすべての引数を確認するには、次を実行します:
./emissary help server
残りのコマンドにはすべて (-b または --projectBase) 引数があり、設定できますが、PROJECT_BASEと一致している必要があります。
configディレクトリはデフォルトで /config に設定されていますが、(-c または --config) で渡すこともできます。gitチェックアウトから実行する場合は、projectBaseとして target を使用してください。開始する前に、target/config内の設定ファイルを自由に変更してください。
ロギングはlogbackによって処理されます。--logbackConfig 引数でカスタムファイルを指定できます。
各コマンドの詳細については、help -c を参照してください。
このコマンドはEmissaryサーバーを起動し、設定されているすべてのプレース、ピックアッププレース、ドロップオフフィルタを初期化します。-m または --mode が指定されていない場合は、スタンドアロンモードで起動します。デフォルトでは、MobileAgentの数はマシンのスペックに基づいて計算されます。最近のコンピュータでは、この数は多くなる可能性があります。エージェントの数は -a または --agents で制御できます。実行例は次のとおりです。
./emissary server -a 2
追加の設定なしで、http://localhost:8001 で起動します。そのURLにブラウザでアクセスすると、target/config/jetty-users.propertiesで定義されているユーザー名とパスワード(emissaryとemissary123)を入力する必要があります。
デフォルトのPickUpPlaceは、target/data/InputData からファイルを読み取るように設定されています。そのディレクトリにファイルをコピーすると、Emissaryがそれらを処理するのを確認できます。toUpperとtoLowerのみが設定されているため、出力はそれほど面白くないことに注意してください。
サービスが作業を受け取るのを停止します
./emissary server --pause
一時停止されたサービスが作業を受け取れるようにします
./emissary server --unpause
リフレッシュ可能なサービスを無効化します。これは、ServiceProviderRefreshablePlaceを無効化するダウンタイムなしのアプローチである「軽い」リフレッシュです。プレースがDirectoryPlaceから取得されると、DirectoryPlaceとNamespaceには同じキーが使用されてプレースが再作成されますが、コンフィギュレータが再ロードされ、プレースはその設定のサブセットを再ロードできます。
./emissary server --invalidate
サービスの強制リフレッシュ。これは「ハード」リフレッシュであり、サーバーは一時停止され、MobileAgentがドレインされるのを待ちます。サーバーが完全にアイドル状態になると、すべてのServiceProviderRefreshablePlaceの既存キーがDirectoryPlaceとNamespaceから削除され、プレースが完全に再作成されます。これにより、サービス名、プロキシ、拒否リストなどの変更が可能になります。その後、サーバーは処理を再開するために一時停止解除されます。リフレッシュ中に障害が発生するとサーバーが悪い状態になる可能性があるため、サーバーはシャットダウンされます。
./emissary server --refresh
サービスをシャットダウンします
./emissary server --stop
サービスを強制的にシャットダウンします
./emissary server --kill
agentsコマンドは、設定されたホストのMobileAgentの数と、それらのエージェントが何をしているかを表示します。デフォルトではポートは9001ですが、-p または --port で変更できます。上記のserverコマンドで8001で実行していると仮定して、次を試してください:
./emissary agents -p 8001
Poolは、ノードのエージェントの折りたたまれたビューです。これもデフォルトでポート9001を使用します。上記で起動したスタンドアロンサーバーに対して実行するには、次を実行します
./emissary pool -p 8001
このコマンドは、すべてのノードのよりわかりやすいビューを提供するため、クラスターでより有用です。
Envコマンドは、サーバーが実行されている必要があります。サーバーにPROJECT_BASEやBIN_DIRなどのいくつかの設定値を要求します。引数なしでは、フォーマットされていないjsonレスポンスをダンプします。
./emissary env
ただし、bashでソースできるレスポンスをダンプすることもできます。
./emissary env --bashable
Emissaryサーバーの起動は実際にこのエンドポイントを呼び出し、設定された変数で $PROJECT_BASE}/env.sh をダンプします。これは、シェルスクリプトが source $PROJECT_BASE}/env.sh を実行して、他の場所で設定を気にすることなくそれらの変数を利用できるようにするためです。
configコマンドを使用すると、指定されたプレース/サービス/クラスの有効な設定を確認できます。Emissaryはフレーバーを使用するため、このコマンドはすべてのフレーバーが適用された後のクラスの結果の設定を表示します。このコマンドは、-h でホスト(デフォルトはlocalhost)、-p でポート(デフォルトは8001)を指定して、実行中のEmissaryノードに接続するために使用できます。ポート8001でローカルに実行されているEmissaryに接続するには、次のいずれかのコマンドが機能します:
./emissary config --place emissary.place.sample.ToLowerPlace
./emissary config --place emissary.place.sample.ToLowerPlace -h localhost -p 8001
オプションで、--offline を使用してオフラインモードを指定し、ローカルのCONFIG_DIRで指定された設定ファイルを使用できます:
./emissary config --place emissary.place.sample.ToLowerPlace --offline
オフラインモードでは、フレーバーを指定して設定の違いを確認できます:
./emissary config --place emissary.place.sample.ToLowerPlace --offline --flavor STANDALONE,TESTING
これらは有効な設定を確認するのに役立ちますが、詳細モードで実行して、すべての設定ファイルと最終出力を確認することもできます。これは --detailed フラグで制御されます:
./emissary config --place emissary.place.sample.ToLowerPlace --detailed
またはオフラインモードで:
./emissary config --place emissary.place.sample.ToLowerPlace --offline --detailed
Emissaryはスタンドアロンでも楽しいですが、実際の作業にはクラスターでの実行がより適切です。クラスターでの実行方法はスタンドアロンと似ていますが、ノードが他のノードに接続するために -m cluster を指定する必要があります。クラスターモードでは、EmissaryはPickUpPlaceの代わりにPickUpClientも起動するため、フィーダーを開始する必要があります。
target/config/peers.cfgを見て、ランデブーピアを確認してください。この場合、3つあります。ポート8001と9001で実行されているノードは単なるEmissaryノードです。ポート7001で実行されているノードはフィーダーです。それでは、2つの異なるターミナルで8001と9001を起動しましょう。
./emissary server -a 2 -m cluster
./emissary server -a 2 -m cluster -p 9001
これらのノードはすべてポート8001、9001、7001を認識しているため、接続を試み続けるとログにエラーが表示されます。
実際のデプロイメントでは、同じノードで複数のEmissaryプロセスを実行しないことに注意してください。ホスト名は -h で設定できます。
ポート8001と9001でノードを起動したら、フィーダーを開始する必要があります。feedコマンドはデフォルトでポート7001を使用しますが、フィーダーが読み取るディレクトリを設定する必要があります。そのディレクトリにドロップされたファイルはワーカーノードが取得できるようになり、作業はクラスター全体に分散されるはずです。フィードを次のように起動します
mkdir ~/Desktop/feed1
./emissary feed -i ~/Desktop/feed1/
ブラウザで http://localhost:8001、http://localhost:9001、http://localhost:7001 にアクセスして、設定されたプレースを確認できるはずです。~/Desktop/feed1 にファイルをいくつかドロップして、2つのノードがそれらを処理するのを確認してください。処理を開始するまでに少し時間がかかる場合があります。
クラスターモードのエージェントは、再びmobileAgentの詳細を表示します。設定したノード(デフォルトではlocalhost:9001)から開始し、認識しているすべてのノードに呼び出して同じ情報を取得します。次のように実行します:
./emissary agents --cluster
クラスターモードのプールも、スタンドアロンのプールと同じことを行います。デフォルトでノード(localhost:9001)から開始し、認識しているすべてのノードに移動して、クラスターの折りたたまれたビューを集約します。次のように実行します
./emissary pool --cluster
トポロジーは、設定されたノード(デフォルトではlocalhost:8001)と通信し、認識しているすべてのノードと通信します。レスポンスはそれらすべてのノードが認識している内容であるため、クラスターのネットワークトポロジーを構築できます。次のように実行します
./emissary topology
キーストアとキーストアパスワードは emissary.client.EmissaryClient-SSL.cfg ファイルにあります。この機能をテストするために使用できるサンプルキーストアがデフォルトで含まれ、設定されています。本番環境でサンプルキーストアを使用することはお勧めしません。独自のキーストアを使用するには、emissary.client.EmissaryClient-SSL.cfg ファイルの設定値を変更してください。
スタンドアロン
./emissary server -p 8443 --ssl --disableSniHostCheck
クラスター
./emissary server -p 8443 --ssl --disableSniHostCheck --mode cluster
./emissary server -p 9443 --ssl --disableSniHostCheck --mode cluster
mkdir ~/Desktop/feed1
./emissary feed -p 7443 --ssl --disableSniHostCheck -i ~/Desktop/feed1/
このプロジェクトに関する質問や懸念がある場合は、次のアドレスまでお問い合わせください: [email protected]
セキュリティに関する質問や脆弱性の報告については、SECURITY.md を参照してください。