Trigger.dev: Run Replayアクションにおける認証の欠如により、組織を跨いだタスク実行が可能(IDOR)

### 概要

`apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts`にあるrun replay `action`関数には、認証または認可のチェックがありません。同じファイル内の`loader`(GET)は、適切に`requireUser(request)`を呼び出し、クエリをユーザーの組織に限定していますが、166行にある`action`(POST)はこれを行いません。これにより、認証されたユーザーは、タスクの`friendlyId`を知っている限り、どの組織のタスクも再実行できるようになります。

### 詳細

**脆弱なファイル:** `apps/webapp/app/routes/resources.taskruns.$runParam.replay.ts`

**`loader`(28-29行) — 適切に認証済み:**
```typescript
export async function loader({ request, params }: LoaderFunctionArgs) {
const user = await requireUser(request); // ✓ 認証チェック
const userId = user.id;
// ... ユーザーの組織に限定されたクエリ
}
```

**`action`(166-193行) — 認証なし:**
```typescript
export const action: ActionFunction = async ({ request, params }) => {
const { runParam } = ParamSchema.parse(params);
// ✗ `requireUser()`の呼び出しなし
// ✗ `requireUserId()`の呼び出しなし
// ✗ 組織メンバーシップのチェックなし

const taskRun = await prisma.taskRun.findFirst({
where: {
friendlyId: runParam, // どのタスクも対象とするクエリ、組織による制限なし
},
include: {
runtimeEnvironment: { select: { slug: true } },
project: { include: { organization: true } },
},
});

// ... 攻撃対象の環境でタスクを再実行する
const replayRunService = new ReplayTaskRunService();
```

177行のPrismaクエリは、`friendlyId`のみでタスクを取得します。`userId`や組織によるフィルタリングはありません。その後、`ReplayTaskRunService`が、攻撃対象の環境で新しいタスクを実行します。このタスクは、攻撃対象の環境変数やシークレットを使用します。

**同じ種類のバグが以下のファイルにも存在します:** `apps/webapp/app/routes/resources.batches.$batchId.check-completion.ts` (17行目) — `action` に認証が設定されていないため、どのユーザーでも任意のバッチIDに対してバッチの完了処理を実行できます。

### 実証実験

**リプレイIDORの実行:**
```bash
# 認証されたユーザーであれば、どの組織のタスク実行でもリプレイが可能
POST /resources/taskruns/run_abc123def/replay
Cookie: <有効なセッション情報>
Content-Type: application/x-www-form-urlencoded

environmentId=<被害者の環境ID>&failedRedirect=/
```

`friendlyId` の値(例:`run_abc123def`)は、短い、増加する文字列であり、列挙可能です。

**バッチの完了処理(同じ種類のバグ):**
```bash
# 認証されたユーザーであれば、どのバッチに対してもバッチの完了処理を実行可能
POST /resources/batches/<batchId>/check-completion
Cookie: <有効なセッション情報>
Content-Type: application/x-www-form-urlencoded

redirectUrl=/
```

### 影響

- **組織を跨いだタスク実行:** 攻撃者は、他の組織に所属するタスク実行をリプレイし、被害者の環境で、被害者の秘密情報やAPIキーを使用してタスクを実行できます。
- **秘密情報の漏洩:** リプレイされたタスクは、被害者の組織の環境変数を使用して実行されるため、データベースの認証情報、APIキー、その他の秘密情報が含まれる可能性があります。
- **リソースの消費:** 攻撃者は、被害者のタスクをリプレイすることで、被害者の計算リソースを消費します。
- **データの整合性:** バッチの完了処理のエンドポイントは、バッチの結果を待っている親タスクを、意図せず再開させる可能性があり、データの整合性の問題を引き起こす可能性があります。
- **攻撃の複雑さの低さ:** `friendlyId` の値は、短く、予測可能な文字列であるため、列挙が可能です。

影響を受けるパッケージ:
- npm (JavaScript) trigger.dev: 影響を受けるバージョンは 4.5.1 以下、4.5.2 で修正済み。