TL;DR : 結合 pull_request_target 信頼されていない PR の明示的なチェックアウトによるワークフローのスパーク オフは不健全な観察であり、単に結果を終わらせる可能性があります
外部からの PR の自動処理fork はおそらく不健康であり、そのような PR は、自分自身の信頼できない入力として扱われるだけで十分に平和的である可能性があります。 CI/CD では、スムーズな PR が提出された場合、それがミッションの作成を原子化しないこと、効率の回帰が開始されないこと、およびチェックに合格していることを明確にすることがよくあります。 しかし、信頼されていない PR に取り組んでいる場合、そのような自動的な習慣により、注意を怠ると同時に、リポジトリが悪用にさらされる可能性があります.
accept as true with または powershell ファイルまたは再定義package.json ファイル内の make スクリプト。 彼らは、他の人とジョギングできるスムーズな外観として、ペイロードを単純に記述します。 実際のmakeが発生する前でも、コードの実行が蓄積されます。 Npm プログラムは、カスタマイズされた preinstall および postinstall スクリプトなので、機能します npm setup は、攻撃者がスムーズなパッケージ参照。 オーケストレーションが高度化されていれば、1 つ以上のコード インジェクション ファセットを所有することができます。 PR のコードを適度に調べることなく、信頼できないソースから PR をチェックアウトして環境マシン上で作成することはありません。 PR の自動処理に固有の危険性に起因する、GitHub のライセンス pull_request ワークフロー スパーク オフはデフォルトで、書き込み権限とシークレットを防ぎ、ゴール リポジトリへのアクセスを蓄積します。 それにもかかわらず、一部のシナリオでは、このような蓄積された入場料は、PR をスマートにルーティングすることが望まれます。 pull_request_target ワークフローのスパーク オフはすぐに終了しました。 ブラウザのセーフティマネキンに Inferior-Foundation Resource Sharing (CORS) を導入したことで、ネットベースのフィールドが可能になったように開発者はデフォルトの Identical Foundation Protection (SOP) を緩和し、pull_request_target の導入 スパーク オフにより、ワークフローの作成者は、ゴール リポジトリに対するいくつかの制限を緩和することができました。 2 つのトリガーの主な違いは次のとおりです。- pull_request_target のタスクによって実行されるワークフロー は、ゴールリポジトリへの書き込み権限を持っています。 彼らは、目標リポジトリの秘密と方法への累積的な入場さえ持っています。 からの
pull_request で行われるワークフローについては、同じことが素晴らしいです。同じリポジトリ内のブランチですが、外部フォークからではなくなりました。 後者の理由は、PR を開発しているユーザーが目標リポジトリへの書き込み権限を既に持っている場合、リポジトリの秘密と方法の半分までは長い道のりで安定しているということです。
pull_request_target は、マージ コミット内ではなく、PR のゴール リポジトリのコンテキスト内で実行されます。 このように、ライセンスされたチェックアウト トドルは、ゴール リポジトリを使用して、ユーザーが装備したコードの意図しない使用を停止します。 これらのセーフガードにより、pull_request_target 追加の権限。 pull_request_target
スパークオフを導入した動機は、ワークフローが PR をマークできるようにするため (例: wants review )またはPRの観察に。 その意図は、不健全な処理、吃音の構築、または PR の素材の処理をもはや必要としない PR の火付け役を行使することです
pull_request_target と一緒に、滑らかなスパークoff workflow_run は、シナリオを許可するために起動されるとすぐに信頼できないコードを構築する必要があり、たとえばコード カバレッジの結果やその他の結果を調べて PR を更新するための書き込み権限も必要です。 安定した定式化でこれを実現するために、信頼されていないコードは pull_request のタスクによって処理される可能性があります。 特権のない雰囲気の中で遠く離れた場所にあるように火花を散らします。 PR を処理するワークフローはおそらく平和的であり、小売業者は独自のコード カバレッジまたはアーティファクトの失敗/合格チェックを行い、終了します。 次のワークフローは workflow_run で開始されます。目標リポジトリへの書き込み許可を付与し、リポジトリの秘密と方法へのアクセスを蓄積する長い道のり。これにより、アーティファクトを取得し、リポジトリへの必須の調整を真実として受け入れたり、サードパーティー企業とやり取りしたりできるようになります。
Under は、以下の結果が得られると想定される使用例の例です。非特権 pull_request ワークフローが特権ワークフローとブレンドされて、購入した PR に従って観測を切り替える: ReceivePR.yml
名前: 安心PR
# Learn-Perfect レポ トークン # 累積入会金なし秘密と方法へ の上: pull_request
: 仕事 ):
作る: 走る
:
ubuntu-most-to-日にち 歩数 :
-
使用
: action/checkout@v2
# のメイクルートの模倣 -
名前: オリジン ジョグ
:
/bin/bash ./make. sh
-
名前: PR数量の設定 ジョグ: |
mkdir - p ./pr echo ${{ github.occasion.quantity }}> ./pr/NR
コメントPR.yml
名前
# 学習書き込みレポ トークン # たまる秘密と道への入場 の上::お問い合わせの際の備考
workflow_run: ワークフロー:
種類
:–
実行されました
仕事: アップロード:
走る
:ubuntu-most up-to-date もしも:
> github.occasion.workflow_run.occasion==’pull_request’ &&
github.occasion.workflow_run.conclusion==’成功’ ステップ: – 名前
:')ダウンロード アーティファクト’ 用途:actions/github-script@v3.1.0
と : 脚本:|var アーティファクト=github.actions.listWorkflowRunArtifacts({
所有者: context.repo.proprietor,
レポ: context.repo.repo, run_id: ${{github.occasion.workflow_run.identification }} , });var matchArtifact=artifacts.recordsdata.artifacts.filter((アーティファクト)=> {
return artifact.name==”pr 「 })[0]; var pick up=github.actions.downloadArtifact({をカウント) )
所有者: context.repo.proprietor,
レポ: context.repo.レポ、
artifact_id: matchArtifact.identification,archive_format: 'zip',
});var fs=require( ‘fs’); fs.writeFileSync(‘${{github.workspace}}/pr.zip’, Buffer.from(pick up.recordsdata)); – ジョグ
:解凍pr.zip –
名前:‘述べる
の上 PR’ 用途 :
actions/github-script@v3 と
: github-token : )${{ 秘密と道.GITHUB_TOKEN }} 脚本
:|var fs=require('fs' ); var issue_number=Quantity(fs.readFileSync(‘./NR’));
github.considerations.createComment({ のカウント所有者: context.repo.proprietor, レポ: context.repo.repo,
発行番号: 発行番号,本体: '万事OKです。 PRありがとうございます! });
- このインスタンスは PR 量をワークフロー アーティファクトとして保存しますが、同じマップ内のコード カバレッジ メッセージまたは同一の PR アーティファクトをクロールするように複雑に拡張する必要はありません。
- アーティファクトからの受信レコードデータは信頼できない可能性があります。 安定した定式化で脆弱な場合、PR 番号を見つけたり、コード カバレッジのテキストを見つけて PR を観察したりする場合、特権ワークフロー コンテキスト内でそのような信頼されていないレコードデータを実行することは、長い道のりです。 それにもかかわらず、アーティファクトが信頼されていない PR から構築されたバイナリであった場合、特権
workflow_run
ワークフロー コンテキスト。 信頼されていない PR レコードデータから生じるアーティファクトは、それ自体が信頼されておらず、特権コンテキストで処理された場合、そのように扱われる可能性があります. ご覧のとおり、2 つのワークフローとワークフロー アーティファクトを渡すと、いくらかのオーバーヘッドが発生します。 ワークフローの状況で、PR にコメントするだけで済み、pull_request_target
は論理的なショートカットです。 残念ながらいくつかのリポジトリワークフローはこれを 1 ステップ余分に解決し、 pull_request_target を明示的な PR チェックアウト、受け入れましょうか:# 安全でない。
の上
:pull_request_target
仕事 : 作る: 名前: 発信してみてください ランズ-の上: ubuntu-most up-to-date
歩数:
-
用途
:actions/checkout@v2 と :
${{ github.occasion.pull_request.head.sha }}
- 使用
:
actions/setup-node@v1
-
ジョグ: | npm セットアップ npm make
ショーケース: 上記のインスタンスは、 の助けを借りて PR についてコメントしています。 github-script これは、すべてのアクションが workflow_run から脆弱であるとは限らないためです。 ) から recordsdata を探して、コンテキスト オブジェクト内の必要なすべてのデータを保護する場合。 workflow_run
コンテキストは、pull_request コンテキストとそれは所有していません。PR を受け入れましょう量。 このようなアクションは、必須ではない明示的な入力パラメーターをキャッチして workflow_run
コンテクスト。
workflow_run
-使用:完全/fakeaction@v2 と: arg1: ${{ 秘密と方法.supersecret }} – 用途
:fakerepo/observation-on-pr@v1 と
: メッセージ:|ありがとう!
信頼されていない可能性のあるコードが
npm setup
極悪非道なレポジトリとヘッド リポジトリをすべてチェックアウトし、差分を生成します チェックしたファイルに対して grep を実行します。または
npm make
PR作成者がmakeスクリプトや参照プログラムを管理しているためというと、ミキシング
pull_request_target 明示的な PR チェックアウトは n o 一貫して影響を受けやすくなります。 ワークフローはおそらくうまくいくでしょう:
コードを再フォーマットしてコミットします
要するに、PR コンテンツが受動的な記録データとして扱われる場合、つまり、作成/発見ルートに影響を与える準備ができていない場合は、遠くまで安定。 ただし、リポジトリの所有者は、Po にならないように気をつけて、平和的に過ごすことができます。
npm セットアップ
. リポジトリの所有者は、この苦痛を和らげるために、次のように考えることもできます:- pull_request_target[
push, pull_request_target] を利用しないように保護する ワークフローがリポジトリの書き込み権限を必要とせず、リポジトリのシークレットとウェイを実行しない場合。 彼らは単純に
pull_request スパーク オフを実行します。その代わり。
workflow_run は、以前のインスタンスと同様です。
シチュエーションを pull_request_target に追加します。 ) クリアマークがPRされていればパーフェクトにジョギングし、自分の安定を見て
は、PR がゴール リポジトリへの書き込み権限を持つすべてのユーザーによって精査されたことを示します。 このおおざっぱなマークは、主に完全に検証に基づいており、攻撃者は、ワークフローが普及した (ラベル付けされた) 後、スムーズな調整をプッシュすることができたが、開始されていないというジョグ状況に傾いていることを示しています。 したがって、この方法は、上記の別の選択肢からの道徳的な解決策が利用されるまで、一時的な解決策としておそらく平和で完璧である可能性があります. 外部の顧客はもはやラベルを配置する権限を持っていないため、事実上、リポジトリの所有者が最初に調整を手動で確認する必要があり、人的エラーが発生する可能性があります.
# 一時的な修正として完全に。 の上:
:
種類 :
[labeled]
仕事
: 作る: 名前
:発信してみてください 走る: ubuntu-most up-to-date
もしも:で構成されています (github. once.pull_request.labels.*.name, '見て安定')
感受性のある住居で確立された修復には、最もよく知られている「落とし穴」がある可能性があることを示すワークフロー。 修正前に開かれたすべての PR は、影響を受けやすいワークフローに対して行われるとすぐに、PR が開かれるとすぐに存在していたワークフローのバージョンを実行します。 保留中の PR が存在する可能性がある場合、PR への更新は影響を受けやすいワークフローを平和的に悪用する可能性があることを示しています。 影響を受けやすいワークフローが固定された後に、信頼できないコミットが追加される可能性がある場合は、そのような PR を閉じるか、リベースすることをお勧めします。 それが可能であるということは、あなた自身にクイズを出すだけです: if the pull_request_target
ワークフロー パーフェクトは、PR をチェックアウトして構築します。つまり、信頼されていないコードを実行しますが、シークレットやウェイを参照しません。平和的に影響を受けやすいですか? はい、ワークフローが pull_request_target で発生したため、長い道のりです。 Peaceful は、学習/書き込みリポジトリ トークンをメモリ内に持っています。 ワークフローが actions/checkout を使用し、現在は使用しない場合必須ではないパラメーター persist-credentials を不正としてクロールする、それはそれをさらに悪化させます。 パラメータのデフォルトは beautiful です。 これは、後続のステップで、作業コードが保存されたリポジトリ トークンをディスクから簡単に学習できることを示しています。 リポジトリへの書き込みや秘密や方法への書き込みを望まない場合は、pull_request を使用して美しいままにします 火花が散る 現在も、影響を受けやすい意図を持つパターンが見られますしかし、
pull_request_target の誤解から生じる運動の壊れているが、影響を受けにくくなったワークフローです。 このような状況では、リポジトリは pull_request_target スパークを利用するように切り替わりました。オフにしますが、
actions/checkout のデフォルト値を実行します)よちよち歩き、抱きしめましょうか:
の上
:
[push, pull_request_target]仕事- 名前):作る: 走る
:ubuntu-most-to-日にち 歩数
:
:
チェックアウト使用:actions/checkout@ v2 - 名前: 発信してみてください ジョグ:
/bin/bash ./make.sh && /bin/bash ./runtests.sh- 名前:
書類もしも: 失敗() && github.occasion.toddle !=’押す’ と: own/commenter@v1 メッセージ: | いくつかのチェックに失敗しました.
- これは著者が想定していたものには達していません。 PR の場合、目標リポジトリから最新の変更セットを構築します。 ワークフローは、実際には PR を行わないという意味で壊れていますが、実際の PR コンテンツの明示的なチェックアウトやそれらのコンテンツの安全でない向きとして、この形式のものが存在しない可能性があるため、幸いなことに影響を受けにくくなっています。 .
結論 この送信では、GitHub ワークフローへの信頼されていない PR 入力を処理する際に最もよくある考慮事項をほぼ間違いなく調べました。 pull_request という特典フェーズの多さを印象づけるのはやり過ぎです。 、 pull_request_target、および workflow_run 受信 PR を処理するコードを提供します。 pull_request_target を利用する際は注意が必要です。特に、信頼されていない PR のコンテンツの明示的な向きとブレンドされている場合は、ワークフローの市場内の目標レポの特権コンテキストが完全に必要な場合と同じです。 この送信は、GitHub Actions の安全性に関する一連の投稿の原則です。 次は教えられる submit 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺
pull_request_target、および workflow_run 受信 PR を処理するコードを提供します。 pull_request_target を利用する際は注意が必要です。特に、信頼されていない PR のコンテンツの明示的な向きとブレンドされている場合は、ワークフローの市場内の目標レポの特権コンテキストが完全に必要な場合と同じです。 この送信は、GitHub Actions の安全性に関する一連の投稿の原則です。 次は教えられる submit 𝚆𝚊𝚝𝚌𝚑 𝙽𝙾𝚆 📺