「自社のサイトやサーバーは、どこまで安全なのか」。この問いに答えるには、まず何を確認すればよいかが決まっていなければなりません。
合同会社FIELDでは、WordPress・Laravel・Linuxサーバー・AWSの構築と保守で使っているセキュリティ点検の観点を、57項目のチェックリスト「checksec」にまとめました。国際的に使われている3つの枠組み、OWASP Top 10:2025・CWE・MITRE ATT&CK v20 の番号をすべての項目に付けています。
ブラウザで開くだけで使えるツールとして、無料で公開します。 自社サイトの点検や、制作会社・保守会社としての定期診断、脆弱性診断の報告書づくりなどに、ぜひお役立てください。
- ダウンロード(HTMLファイル1枚・ZIP): checksec-1.0.zip をダウンロード
入力した内容とチェック結果はお使いのブラウザの中にだけ保存され、外部へは一切送信されません。
3つの枠組みを1枚にまとめた理由
セキュリティの「ものさし」として有名なものが3つあります。それぞれ見ている場所が違うため、どれか1つだけでは点検に抜けが出ます。
| 枠組み | 提供元 | 何をまとめたものか | 向いている用途 |
|---|---|---|---|
| OWASP Top 10:2025 | OWASP | Webアプリの危険の「分類」上位10項目 | 診断・コードレビューの観点、報告書の章立て |
| CWE | MITRE | 脆弱性の「種類」の辞書(例: CWE-79 = XSS) | 個々の指摘を正式な名称で書く |
| ATT&CK | MITRE | 侵入した攻撃者の「行動」の辞書(戦術×技術) | サーバー運用の点検、侵入時の調査、対策が必要な理由の説明 |
ひとことで言えば、「診断はOWASP+CWE、運用と事故対応はATT&CK」です。
Webアプリの脆弱性(SQLインジェクションやXSSなど)は、OWASPとCWEで漏れなく拾えます。一方で、実際の被害は「脆弱性を突かれたあと」に広がります。Webシェル(遠隔操作用の裏口ファイル)を置かれる、cronに再感染の仕掛けを入れられる、SSH鍵を追加される、ログを消される。こうした侵入後の行動を点検の観点に入れるには、ATT&CKが欠かせません。
checksecでは、1つの項目に3つの番号を並べて書いています。たとえば「.envファイルが外から見える」という項目には、次の番号が付いています。
- OWASP: A02:2025 Security Misconfiguration(セキュリティ設定ミス)
- CWE: CWE-538 Insertion of Sensitive Information into Externally-Accessible File or Directory
- ATT&CK: T1552.001 Unsecured Credentials: Credentials In Files
報告書にこの番号を添えると、「どの基準のどの問題か」を相手と同じ言葉で共有できます。
2025〜2026年の変更点も反映しています
OWASP Top 10:2025
2021年版から構成が変わりました。checksecは2025年版のカテゴリで分類しています。
| ID | カテゴリ |
|---|---|
| A01:2025 | Broken Access Control(アクセス制御の不備) |
| A02:2025 | Security Misconfiguration(セキュリティ設定ミス) |
| A03:2025 | Software Supply Chain Failures(ソフトウェアサプライチェーンの不備) |
| A04:2025 | Cryptographic Failures(暗号化の不備) |
| A05:2025 | Injection(インジェクション) |
| A06:2025 | Insecure Design(安全でない設計) |
| A07:2025 | Authentication Failures(認証の不備) |
| A08:2025 | Software or Data Integrity Failures(ソフトウェア/データ完全性の不備) |
| A09:2025 | Security Logging and Alerting Failures(ログ・アラートの不備) |
| A10:2025 | Mishandling of Exceptional Conditions(例外状態の不適切な処理) |
特に注目したいのは、新しく加わった A10(例外状態の不適切な処理) です。デバッグ画面に環境変数が表示される、外部APIのエラーを握りつぶした結果、権限の確認や決済の確認が素通りになる(fail-open)、といった問題がここに入ります。
MITRE ATT&CK v20
最新のv20では、以前の「Defense Evasion(防御回避)」が Stealth(TA0005) と Defense Impairment(TA0112) の2つの戦術に分かれ、全部で15戦術になりました。ログの消去などの技術IDも新しくなっています。checksecの技術IDは、すべてv20のマトリクスで照合しています。
チェックリストの中身
57項目を7つの区分に分け、それぞれに優先度(高・中・低)を付けています。
| 区分 | 項目数 | 主な内容 |
|---|---|---|
| 公開面(外から確認) | 8 | .env・.git・バックアップファイルの露出、デバッグ画面、TLS、開いているポート、Cookie属性 |
| サーバー(Linux/EC2) | 13 | SSHの設定、authorized_keys、cron、Webシェルの検知、権限、マイニング、ログ、バックアップ |
| WordPress | 9 | 改ざん検知、更新、管理者アカウント、ログイン保護、uploads内のPHP |
| Laravel | 11 | APP_DEBUG、APP_KEY、composer audit、IDOR、Mass Assignment、生SQL、Bladeのエスケープ |
| AWS | 5 | セキュリティグループ、S3の公開設定、IAM、IMDSv2、CloudTrail |
| 社内運用・制作会社リスク | 6 | 接続情報・SSH鍵の管理、踏み台、退職者の鍵、デプロイ時の退避ファイル、平文FTP |
| 侵入・改ざん時の初動 | 5 | 証拠保全 → 被害範囲の特定 → 認証情報の入れ替え → 横展開の確認 → 報告 |
各項目には次の4つを載せています。
- なぜ必要か(どんな被害につながるか)
- 確認方法(コピーしてそのまま使えるコマンド。すべて読み取り専用)
- 対策
- OWASP・CWE・ATT&CKの番号(クリックすると公式ページが開きます)
コマンドの例はWordPress・Laravel・Linux・AWSで示していますが、「設定ファイルを公開しない」「本番でデバッグを無効にする」「本人のデータかを確認する」「ログを残す」といった考え方は、ほかの言語やフレームワーク、クラウドでもそのまま当てはまります。お使いの環境に読み替えてご利用ください。
チェックリスト全57項目
配布しているツールと同じ内容です。確認方法のコマンドの example.com・/var/www/html・my-bucket は、ご自身の環境に置き換えてください。コマンドは原則として読み取りだけを行うものです。対策の欄に [変更] とあるものは、バックアップを取ってから作業してください。
公開面(外から確認)(8項目)
P1 .env・.git・バックアップファイルが公開されていない(優先度:高)
一番多く、一番被害が大きい事故。.envにはDBパスワードやAPP_KEY、.gitにはソース一式が入っています。deploy時の .bak や zip も対象です。
確認方法
for p in .env .env.bak .git/HEAD .git/config wp-config.php.bak wp-config.php~ wp-config.php.save .DS_Store composer.lock backup.zip backup.sql dump.sql phpinfo.php info.php .htpasswd; do
printf '%-22s %s\n' "$p" "$(curl -s -o /dev/null -w '%{http_code}' 'https://example.com/'"$p")"
done # 200 が出たら NG(403/404 なら OK)
対策:Webサーバーでドット始まりのファイルと *.bak / *.sql / *.zip へのアクセスを拒否する。不要なファイルは公開ディレクトリの外へ移す。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) / A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-538 Sensitive Info in Externally-Accessible File / CWE-527 Exposure of Version-Control Repository / CWE-530 Exposure of Backup File | ATT&CK T1552.001 Unsecured Credentials: Credentials In Files / T1595 Active Scanning
P2 エラー詳細・デバッグ画面が表示されない(優先度:高)
Laravelのデバッグ画面(Ignition)やPHPのWarningは、パス、環境変数、SQLを漏らします。2025年版で新設のA10(例外処理)に当たります。
確認方法
curl -s 'https://example.com/__checksec_404_test' | grep -iE 'Whoops|Ignition|Stack trace|Warning:|Fatal error|SQLSTATE|vendor/laravel' | head
curl -s -o /dev/null -w 'ignition: %{http_code}\n' 'https://example.com/_ignition/health-check' # 200 なら NG
対策:本番は APP_DEBUG=false / WP_DEBUG=false / display_errors=Off。エラーページは独自の簡素なページにする。
対応する番号:OWASP A10:2025 Mishandling of Exceptional Conditions(例外状態の不適切な処理) / A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-209 Error Message Containing Sensitive Info / CWE-489 Active Debug Code | ATT&CK T1595 Active Scanning / T1190 Exploit Public-Facing Application
P3 セキュリティヘッダーが付いている(優先度:中)
改ざんされたり外部スクリプトを読み込まれたりしたときに、被害を小さくする最後の防御線です。
確認方法
curl -sI 'https://example.com/' | grep -iE '^(strict-transport-security|x-content-type-options|x-frame-options|content-security-policy|referrer-policy|permissions-policy):'
対策:最低でも HSTS、X-Content-Type-Options: nosniff、X-Frame-Options: SAMEORIGIN(または CSP frame-ancestors)、Referrer-Policy を付ける。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-693 Protection Mechanism Failure / CWE-1021 Clickjacking | ATT&CK T1189 Drive-by Compromise
P4 HTTPS強制・証明書の期限・古いTLSの無効化(優先度:高)
証明書の期限切れはサイト停止と同じ。TLS 1.0/1.1が有効だと診断で必ず指摘されます。
確認方法
curl -s -o /dev/null -w 'http->%{http_code} %{redirect_url}\n' 'http://example.com/'
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -enddate
echo | openssl s_client -tls1_1 -connect example.com:443 2>&1 | grep -qE 'Cipher is \(NONE\)|alert|error' && echo 'TLS1.1: 無効(OK)' || echo 'TLS1.1: 有効?(要確認)'
対策:http→httpsへ301で転送する。証明書は自動更新(certbotなど)にして、期限を監視する。TLS1.2以上だけを許可する。
対応する番号:OWASP A04:2025 Cryptographic Failures(暗号化の不備) | CWE CWE-319 Cleartext Transmission / CWE-326 Inadequate Encryption Strength
P5 ディレクトリの中身が一覧表示されない(優先度:中)
uploadsなどのディレクトリが一覧表示されると、非公開のつもりのPDFや個人情報が見つかってしまいます。
確認方法
for d in wp-content/uploads/ wp-content/plugins/ storage/ uploads/ files/ backup/; do
curl -s 'https://example.com/'"$d" | grep -q 'Index of' && echo "NG: $d" || echo "ok: $d"
done
対策:Apacheなら Options -Indexes、nginxなら autoindex off にする。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-548 Directory Listing | ATT&CK T1083 File and Directory Discovery
P6 バージョン情報を出しすぎていない(優先度:低)
PHPやApacheのバージョンが見えると、攻撃者が使える既知の脆弱性を絞り込めます。単体の危険度は低いものの、診断では定番の指摘です。
確認方法
curl -sI 'https://example.com/' | grep -iE '^(server|x-powered-by):'
curl -s -o /dev/null -w 'readme.html: %{http_code}\n' 'https://example.com/readme.html'
対策:ServerTokens Prod / server_tokens off / expose_php = Off。WordPressの readme.html は削除するかアクセスを拒否する。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-200 Exposure of Sensitive Information | ATT&CK T1595 Active Scanning
P7 不要なポートが外部に開いていない(自社サーバーのみ)(優先度:高)
MySQL、Redis、管理画面用のポートが外部に開いていると、直接侵入されます。SSHやFTPも接続元を絞るのが基本です。
確認方法
nmap -Pn -p 21,22,25,80,443,3306,5432,6379,8080,8443,9000,9200,11211 example.com # 自社・許可済みのホストのみ
対策:必要なのは 80/443 だけ。22 は社内IPや踏み台からだけ許可する(AWSならセキュリティグループで絞る)。DB類は外部に公開しない。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-284 Improper Access Control | ATT&CK T1133 External Remote Services / T1595 Active Scanning
P8 Cookie に Secure / HttpOnly / SameSite が付いている(優先度:中)
セッションCookieが盗まれると、ログイン済みの状態を乗っ取られます。
確認方法
curl -sI 'https://example.com/' 'https://example.com/login' 'https://example.com/wp-login.php' | grep -i '^set-cookie:'
対策:Laravel: SESSION_SECURE_COOKIE=true、same_site=lax。WordPressはHTTPS化していれば基本的に付与される。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) | CWE CWE-614 Cookie without Secure / CWE-1004 Cookie without HttpOnly / CWE-613 Insufficient Session Expiration
サーバー(Linux/EC2)(13項目)
S1 SSH: パスワード認証とrootログインを禁止している(優先度:高)
SSHへの総当たりは常時来ています。パスワード認証のままのサーバーが一番狙われます(共有ホスティングで変えられない場合は「対象外」として、強いパスワードを使う)。
確認方法
sudo sshd -T 2>/dev/null | grep -Ei '^(passwordauthentication|permitrootlogin|pubkeyauthentication|kbdinteractiveauthentication) '
対策:[変更] PasswordAuthentication no / PermitRootLogin no(または prohibit-password)。変更後は別のセッションでログインできることを確認してから、今のセッションを閉じる。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) | CWE CWE-307 Excessive Authentication Attempts / CWE-287 Improper Authentication | ATT&CK T1110 Brute Force / T1133 External Remote Services / T1078 Valid Accounts
S2 authorized_keys の棚卸し(知らない鍵がない)(優先度:高)
侵入した攻撃者が最初に仕掛ける裏口です。退職者や外注先の鍵が残っているのも同じリスクです。
確認方法
for f in /root/.ssh/authorized_keys /home/*/.ssh/authorized_keys; do
[ -f "$f" ] && { echo "== $f ($(sudo stat -c %y "$f" 2>/dev/null))"; sudo awk '{print $1, $NF}' "$f"; }
done
対策:全部の鍵について持ち主が分かる状態にする(コメント欄に名前を入れる)。分からない鍵は確認してから削除する。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) / A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-284 Improper Access Control | ATT&CK T1098.004 Account Manipulation: SSH Authorized Keys / T1078 Valid Accounts
S3 cron に不審なジョブがない(優先度:高)
Webシェルを消しても、cronが数分ごとに再設置する、というのが改ざん被害の定番パターンです。
確認方法
sudo ls -la /etc/cron.d /etc/cron.hourly /var/spool/cron /var/spool/cron/crontabs 2>/dev/null
for u in $(cut -d: -f1 /etc/passwd); do sudo crontab -l -u "$u" 2>/dev/null | grep -v '^#' | sed "s/^/[$u] /"; done
systemctl list-timers --all --no-pager | head -30
対策:curl/wget の結果を sh に渡すもの、base64、/tmp や /dev/shm 内のファイルを実行するものは要調査。
対応する番号:OWASP A08:2025 Software or Data Integrity Failures(ソフトウェア/データ完全性の不備) | CWE CWE-506 Embedded Malicious Code | ATT&CK T1053.003 Scheduled Task/Job: Cron / T1059.004 Command and Scripting Interpreter: Unix Shell / T1105 Ingress Tool Transfer
S4 不審なOSユーザー・sudo権限がない(優先度:高)
攻撃者が後で入り直すための裏口アカウントです。UID 0 のユーザーは root だけのはずです。
確認方法
awk -F: '$3==0 || $3>=1000 {print $1, "uid="$3, $7}' /etc/passwd
getent group sudo wheel admin 2>/dev/null
sudo ls -la /etc/sudoers.d/
対策:不要なユーザーはロックする(usermod -L)。sudoできる人を最小限にする。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-269 Improper Privilege Management | ATT&CK T1136 Create Account / T1078 Valid Accounts
S5 ログイン履歴に不審なものがない(優先度:中)
知らないIPからのログイン成功は、侵入済みのサインです。
確認方法
last -n 30 -a | head -40
sudo lastb -n 10 2>/dev/null
sudo grep -hE 'Accepted (password|publickey)' /var/log/auth.log /var/log/secure 2>/dev/null | tail -20
対策:接続元が想定(社内IPや踏み台)以外ならインシデント対応(I区分)へ。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | CWE CWE-778 Insufficient Logging | ATT&CK T1078 Valid Accounts / T1110 Brute Force
S6 OS・PHP・ミドルウェアがサポート期間内で、更新されている(優先度:高)
サポートが終了したOSやPHPには、修正が出ません。CentOS 7、Amazon Linux 2、PHP 8.1以前など、サポートが終了した(または終了間近の)ものが残っていないか確認してください。
確認方法
cat /etc/os-release | head -3; uname -r
php -v 2>/dev/null | head -1; (httpd -v || apache2 -v || nginx -v) 2>&1 | head -2; mysql --version 2>/dev/null
(apt list --upgradable 2>/dev/null || dnf -q check-update 2>/dev/null || yum -q check-update 2>/dev/null) | grep -c . # 未適用の更新数
対策:[変更] セキュリティ更新を定期的に適用する。サポートが終了したものは、移行を計画する(必要に応じて関係者・お客さまに提案する)。
対応する番号:OWASP A03:2025 Software Supply Chain Failures(ソフトウェアサプライチェーンの不備) | CWE CWE-1104 Unmaintained Third-Party Components / CWE-1395 Dependency on Vulnerable Third-Party Component | ATT&CK T1190 Exploit Public-Facing Application
S7 Webルートに不審なPHP・最近改変されたファイルがない(優先度:高)
Webシェル(遠隔操作用の裏口PHP)と改ざんの検知です。難読化の定番パターンで検索します。
確認方法
sudo find /var/www/html -type f -name '*.php' -mtime -7 -printf '%TY-%Tm-%Td %TH:%TM %p\n' 2>/dev/null | sort -r | head -40
sudo grep -rlE 'eval\s*\(\s*(base64_decode|gzinflate|str_rot13|gzuncompress)|assert\s*\(\s*\$_(POST|GET|REQUEST)|preg_replace\s*\(.*/e' /var/www/html --include='*.php' 2>/dev/null | head -20
対策:見つかった場合は消す前にコピーと日時を記録する(I1)。デプロイしていない日時に変更されたファイルは要調査。
対応する番号:OWASP A08:2025 Software or Data Integrity Failures(ソフトウェア/データ完全性の不備) | CWE CWE-506 Embedded Malicious Code / CWE-94 Code Injection | ATT&CK T1505.003 Server Software Component: Web Shell / T1491.002 Defacement: External Defacement
S8 重要ファイルの権限・Webユーザーの書き込み範囲が最小(優先度:中)
.env や wp-config.php を誰でも読める、あるいはWebサーバーのユーザーがPHPファイルに書き込める状態だと、侵入後の被害が大きくなります。
確認方法
sudo find /var/www/html -maxdepth 3 \( -name '.env' -o -name 'wp-config.php' \) -exec stat -c '%a %U:%G %n' {} \;
sudo find /var/www/html -type f -perm -o+w 2>/dev/null | head -20 # その他ユーザーが書き込み可能なファイル
対策:[変更] .env と wp-config.php は 640 または 600。777 は使わない。書き込みを許可するのは uploads や storage だけにする。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) / A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-732 Incorrect Permission for Critical Resource | ATT&CK T1222 File and Directory Permissions Modification / T1552.001 Unsecured Credentials: Credentials In Files
S9 CPU異常・/tmp内の不審な実行ファイルがない(マイニング検知)(優先度:中)
侵入されたサーバーでは、仮想通貨のマイニングが定番です。AWSの請求額が急に増えて発覚することもあります。
確認方法
ps aux --sort=-%cpu | head -8
sudo ls -la /tmp /var/tmp /dev/shm 2>/dev/null | grep -vE '^total|^d' | head -30
対策:見慣れないプロセス名(kdevtmpfsi、xmrig、ランダムな名前など)が見つかったらインシデント対応へ。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | CWE CWE-400 Uncontrolled Resource Consumption | ATT&CK T1496 Resource Hijacking / T1105 Ingress Tool Transfer
S10 不審な外向き通信がない(優先度:低)
遠隔操作サーバー(C2)への接続や、データを持ち出す通信の兆候を確認します。
確認方法
sudo ss -tnp state established 2>/dev/null | awk 'NR>1{print $4, $5, $6}' | sort | uniq -c | sort -rn | head -30
対策:DB・決済API・メール送信以外の、見知らぬ海外IPや高ポートへの常時接続は要調査。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | ATT&CK T1071 Application Layer Protocol / T1048 Exfiltration Over Alternative Protocol
S11 ログが残っている・消された形跡がない(優先度:中)
攻撃者は最後に痕跡を消します。ログがないと被害の範囲を説明できず、顧客への報告で困ります。
確認方法
sudo ls -la /var/log/ | head -30
sudo journalctl --disk-usage 2>/dev/null
sudo ls -la /root/.bash_history /home/*/.bash_history 2>/dev/null # 0バイトや /dev/null へのリンクは要注意
対策:アクセスログ・認証ログは最低でも90日保存する(logrotateの設定)。可能ならCloudWatch Logsなど外部へ転送する。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | CWE CWE-778 Insufficient Logging | ATT&CK T1685.006 Disable or Modify Tools: Clear Linux or Mac System Logs / T1690 Prevent Command History Logging / T1070 Indicator Removal
S12 バックアップがサーバーの外にあり、復元を試したことがある(優先度:高)
ランサムウェアや誤削除への唯一の備えです。同じサーバー内にしかないバックアップは、一緒に消えます。
確認方法
# AWS: スナップショットの最新日時
aws ec2 describe-snapshots --owner-ids self --query 'reverse(sort_by(Snapshots,&StartTime))[:5].[StartTime,VolumeId,Description]' --output table
対策:DBとアップロードファイルを毎日、別の場所(S3や別アカウント)に保存する。半年に1回は復元テストをする。
対応する番号:OWASP A06:2025 Insecure Design(安全でない設計) | ATT&CK T1485 Data Destruction / T1486 Data Encrypted for Impact
S13 総当たり対策(fail2ban / WAF)(優先度:低)
SSH、wp-login、Laravelのログインへの総当たりを自動で遮断します。
確認方法
sudo fail2ban-client status 2>/dev/null || echo 'fail2ban なし'
対策:fail2ban、またはAWS WAF / CloudFrontのレート制限を導入する。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) | CWE CWE-307 Excessive Authentication Attempts | ATT&CK T1110 Brute Force
WordPress(9項目)
W1 コア・プラグインのファイルが改ざんされていない(優先度:高)
公式の配布物との差分を検出します。改ざん検知としては一番確実な方法です。
確認方法
cd /var/www/html && wp core verify-checksums && wp plugin verify-checksums --all
対策:差分があったファイルは中身を確認する。改ざんなら公式版で置き換え、侵入経路を調べる(I区分)。
対応する番号:OWASP A08:2025 Software or Data Integrity Failures(ソフトウェア/データ完全性の不備) | CWE CWE-345 Insufficient Verification of Data Authenticity / CWE-506 Embedded Malicious Code | ATT&CK T1505.003 Server Software Component: Web Shell / T1491.002 Defacement: External Defacement
W2 コア・プラグイン・テーマが最新(優先度:高)
WordPressが侵害される原因のほとんどは、古いプラグインです。
確認方法
cd /var/www/html && wp core check-update
wp plugin list --update=available --fields=name,status,version,update_version
wp theme list --update=available --fields=name,status,version,update_version
対策:[変更] ステージングで確認してから更新する。マイナー更新とセキュリティ更新は自動更新を検討する。
対応する番号:OWASP A03:2025 Software Supply Chain Failures(ソフトウェアサプライチェーンの不備) | CWE CWE-1395 Dependency on Vulnerable Third-Party Component / CWE-1104 Unmaintained Third-Party Components | ATT&CK T1190 Exploit Public-Facing Application / T1195 Supply Chain Compromise
W3 使っていない・開発が止まったプラグイン/テーマがない(優先度:中)
無効化しているだけのプラグインも、PHPファイルは直接実行できます。公式ディレクトリから削除されたプラグインは特に危険です。
確認方法
cd /var/www/html && wp plugin list --status=inactive --fields=name,version
wp theme list --status=inactive --fields=name,version
対策:[変更] 不要なものは削除する(無効化だけでは不十分)。最終更新が2年以上前のものは代わりを検討する。
対応する番号:OWASP A03:2025 Software Supply Chain Failures(ソフトウェアサプライチェーンの不備) | CWE CWE-1104 Unmaintained Third-Party Components | ATT&CK T1190 Exploit Public-Facing Application / T1195 Supply Chain Compromise
W4 管理者アカウントに知らないものがない(優先度:高)
侵入された後に、管理者ユーザーが追加されるのは定番です。
確認方法
cd /var/www/html && wp user list --role=administrator --fields=ID,user_login,user_email,user_registered
対策:不明なアカウントは削除する前に作成日時を記録する。共有アカウントはやめ、1人1アカウントにする。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) / A07:2025 Authentication Failures(認証の不備) | CWE CWE-269 Improper Privilege Management | ATT&CK T1136 Create Account / T1078 Valid Accounts
W5 ログイン保護(2要素認証・試行回数制限・xmlrpc無効)(優先度:高)
xmlrpc.php は1回のリクエストで大量のパスワードを試せるため、総当たりの温床になります。
確認方法
curl -s -o /dev/null -w 'xmlrpc POST: %{http_code}\n' -X POST 'https://example.com/xmlrpc.php' # 405/403/404 なら OK
cd /var/www/html && wp plugin list --status=active --field=name | grep -iE '2fa|two-factor|wordfence|limit-login|siteguard|loginizer'
対策:2要素認証とログイン試行の制限を入れる(SiteGuard WP Pluginなど)。xmlrpcは使っていなければ遮断する。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) | CWE CWE-307 Excessive Authentication Attempts / CWE-308 Single-factor Authentication | ATT&CK T1110 Brute Force / T1078 Valid Accounts
W6 ユーザー名が列挙されない(優先度:中)
ログインIDが分かると、総当たりの難しさが半分になります。
確認方法
curl -s 'https://example.com/wp-json/wp/v2/users' | head -c 300; echo
curl -s -o /dev/null -w '?author=1: %{http_code} %{redirect_url}\n' 'https://example.com/?author=1'
対策:REST APIの users エンドポイントを未ログインでは使えなくし、author アーカイブへの転送を止める。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-200 Exposure of Sensitive Information | ATT&CK T1595 Active Scanning / T1110 Brute Force
W7 uploads フォルダでPHPが実行されない(優先度:高)
アップロード機能の脆弱性でPHPを置かれても、実行さえされなければ被害を防げます。
確認方法
sudo find /var/www/html/wp-content/uploads -type f -iname '*.php*' 2>/dev/null | head
cat /var/www/html/wp-content/uploads/.htaccess 2>/dev/null
対策:[変更] uploads 配下でPHPの実行を禁止する(Apache: .htaccess で php を Deny、nginx: location で deny)。
対応する番号:OWASP A06:2025 Insecure Design(安全でない設計) / A08:2025 Software or Data Integrity Failures(ソフトウェア/データ完全性の不備) | CWE CWE-434 Unrestricted File Upload | ATT&CK T1505.003 Server Software Component: Web Shell
W8 wp-config.php の安全設定(優先度:中)
管理画面からファイルを編集できる状態だと、管理者アカウントを1つ乗っ取られただけでWebシェルを置かれます。
確認方法
cd /var/www/html && for k in WP_DEBUG WP_DEBUG_DISPLAY DISALLOW_FILE_EDIT FORCE_SSL_ADMIN; do printf '%-20s ' "$k"; wp config get "$k" 2>/dev/null || echo '(未定義)'; done
対策:WP_DEBUG=false、DISALLOW_FILE_EDIT=true、FORCE_SSL_ADMIN=true。認証キー(salt)は既定値のまま使わない。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-489 Active Debug Code | ATT&CK T1505.003 Server Software Component: Web Shell
W9 自作テーマ・プラグインに典型的な脆弱コードがない(優先度:中)
制作側が自分で書いたコードは、制作側の責任範囲です。フォーム、検索、AJAX処理が要注意です。
確認方法
cd /var/www/html/wp-content/themes
grep -rnE 'echo\s+\$_(GET|POST|REQUEST)' . | head # XSS
grep -rnE '\$wpdb->(query|get_results|get_var|get_row|get_col)\(\s*"[^"]*\$' . | head # prepare なしのSQL
grep -rnE "add_action\(\s*'wp_ajax_" . | head # AJAX: nonce と権限チェックを目視
対策:出力は esc_html / esc_attr / esc_url、SQLは $wpdb->prepare、更新系処理は nonce と current_user_can で確認する。
対応する番号:OWASP A05:2025 Injection(インジェクション) / A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-79 Cross-site Scripting / CWE-89 SQL Injection / CWE-352 CSRF / CWE-862 Missing Authorization | ATT&CK T1190 Exploit Public-Facing Application
Laravel(11項目)
L1 本番で APP_DEBUG=false / APP_ENV=production(優先度:高)
Laravelでデバッグモードのまま本番に出すと、環境変数(DBのパスワードなど)が画面に出ます。過去のCVEでは遠隔からコードを実行された例もあります。
確認方法
cd /var/www/html && grep -E '^APP_(ENV|DEBUG|URL)=' .env
php artisan about --only=environment 2>/dev/null
対策:APP_ENV=production、APP_DEBUG=false にする。変更後は php artisan config:cache を実行する。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) / A10:2025 Mishandling of Exceptional Conditions(例外状態の不適切な処理) | CWE CWE-489 Active Debug Code / CWE-209 Error Message Containing Sensitive Info | ATT&CK T1190 Exploit Public-Facing Application / T1552.001 Unsecured Credentials: Credentials In Files
L2 .env をGitで管理していない・APP_KEY が漏れていない(優先度:高)
APP_KEY が漏れると、Cookieを偽造できます(バージョンや設定によっては遠隔からコードを実行されます)。
確認方法
cd /var/www/html && git ls-files 2>/dev/null | grep -E '(^|/)\.env($|\.)' | grep -v '.env.example'
git log --all --oneline -- .env 2>/dev/null | head -3 # 過去に一度でもコミットされていれば要対応
対策:一度でも漏れたら、APP_KEY・DBのパスワード・APIキーをすべて入れ替える(I3)。.gitignore に .env を入れる。
対応する番号:OWASP A04:2025 Cryptographic Failures(暗号化の不備) / A08:2025 Software or Data Integrity Failures(ソフトウェア/データ完全性の不備) | CWE CWE-798 Hard-coded Credentials / CWE-321 Hard-coded Cryptographic Key | ATT&CK T1552.001 Unsecured Credentials: Credentials In Files
L3 依存パッケージに既知の脆弱性がない(優先度:高)
Laravel本体や依存しているcomposer/npmパッケージのCVEです。
確認方法
cd /var/www/html && composer audit
npm audit --omit=dev 2>/dev/null | tail -5
対策:[変更] composer update でパッチを当て、テストしてからデプロイする。Laravelのサポート期間も確認する。
対応する番号:OWASP A03:2025 Software Supply Chain Failures(ソフトウェアサプライチェーンの不備) | CWE CWE-1395 Dependency on Vulnerable Third-Party Component | ATT&CK T1195 Supply Chain Compromise / T1190 Exploit Public-Facing Application
L4 認可漏れ・IDOR(他人のデータが見えない)(優先度:高)
URLの数字を変えると他人の予約や応募データが見える、という不具合は、診断で最も多く見つかる重大な指摘です(OWASP 1位)。
確認方法
cd /var/www/html && php artisan route:list --except-vendor --columns=method,uri,middleware 2>/dev/null | grep -vE 'auth|guest' | head -40
# 手動: ユーザーAでログインし、ユーザーBのID(/orders/123 など)を直接開いて 403/404 になるか
対策:Policy / Gate を使う。「ログインしているか」だけでなく「本人のデータか」を必ず確認する(->where(‘user_id’, auth()->id()))。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-862 Missing Authorization / CWE-639 Authorization Bypass via User-Controlled Key (IDOR) | ATT&CK T1190 Exploit Public-Facing Application
L5 Mass Assignment(一括代入)(優先度:中)
$request->all() をそのまま create に渡すと、is_admin などの項目も書き換えられてしまいます。
確認方法
cd /var/www/html && grep -rnE 'guarded\s*=\s*\[\s*\]' app/Models | head
grep -rnE '(create|update|fill)\(\s*\$request->all\(\)' app/ | head
対策:$fillable を明示する。$request->validated() または only([…]) を使う。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) / A06:2025 Insecure Design(安全でない設計) | CWE CWE-915 Mass Assignment | ATT&CK T1190 Exploit Public-Facing Application
L6 生SQLに入力値を連結していない(優先度:高)
Eloquentを使っていても、Raw系のメソッドではSQLインジェクションが起き得ます。
確認方法
cd /var/www/html && grep -rnE 'DB::(raw|select|statement|unprepared)\(|(where|orderBy|having|select)Raw\(' app/ | grep '\$' | head -20
対策:バインド(?)を使う。orderBy の列名はホワイトリストで確認する。
対応する番号:OWASP A05:2025 Injection(インジェクション) | CWE CWE-89 SQL Injection | ATT&CK T1190 Exploit Public-Facing Application
L7 Blade の {!! !!} でユーザー入力を出力していない(優先度:高)
{!! !!} はエスケープされないため、XSSの原因になります。
確認方法
cd /var/www/html && grep -rn '{!!' resources/views | head -30
対策:基本は {{ }} を使う。HTMLを出す必要があるときは HTMLPurifier などで無害化する。
対応する番号:OWASP A05:2025 Injection(インジェクション) | CWE CWE-79 Cross-site Scripting | ATT&CK T1190 Exploit Public-Facing Application
L8 ファイルアップロードの検証と保存場所(優先度:高)
拡張子やMIMEを確認せず public 配下に保存すると、PHPを置かれて実行されます。
確認方法
cd /var/www/html && grep -rnE "(store|storeAs|move)\(" app/ | head -20
grep -rnE "'(file|image|mimes|mimetypes)[:|]" app/Http | head -20
対策:mimes / max でバリデーションする。保存先は storage(非公開)にし、ファイル名はサーバー側で生成する。
対応する番号:OWASP A06:2025 Insecure Design(安全でない設計) | CWE CWE-434 Unrestricted File Upload / CWE-22 Path Traversal | ATT&CK T1505.003 Server Software Component: Web Shell
L9 ログインの試行回数制限・パスワードハッシュ(優先度:中)
管理画面への総当たり対策です。自作したログイン処理では、試行回数の制限がよく抜けています。
確認方法
cd /var/www/html && grep -rnE 'throttle|RateLimiter' routes/ app/Providers app/Http 2>/dev/null | head
grep -rnE 'md5\(|sha1\(' app/ | grep -i pass | head
対策:ログインのルートには throttle を付ける。パスワードは Hash::make(bcrypt/argon2)で保存する。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) / A04:2025 Cryptographic Failures(暗号化の不備) | CWE CWE-307 Excessive Authentication Attempts / CWE-916 Weak Password Hash | ATT&CK T1110 Brute Force
L10 ログに個人情報・秘密情報を出していない/ログが公開されていない(優先度:中)
laravel.log にリクエストの全文やトークンが書かれている例はよくあります。public 配下に置いていると外から読めます。
確認方法
curl -s -o /dev/null -w 'laravel.log: %{http_code}\n' 'https://example.com/storage/logs/laravel.log'
cd /var/www/html && grep -rnE 'Log::(info|debug)\(.*(\$request->all|password|token)' app/ | head
対策:ドキュメントルートは public/ にする。ログにパスワードやトークンを出さない(マスクする)。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) / A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-532 Sensitive Info in Log File | ATT&CK T1552 Unsecured Credentials
L11 例外時に「許可」側へ倒れない(fail-open)(優先度:中)
OWASP 2025年版で新設されたA10の項目です。外部APIのエラーや例外を握りつぶした結果、決済や権限の確認がスキップされる、という類の不具合です。
確認方法
cd /var/www/html && grep -rnE 'catch\s*\(\s*\\?(Throwable|Exception)' app/ | head -20 # catch 後に return true / 処理続行していないか目視
対策:例外時は「拒否・中断」にする。catch したら必ずログを出し、処理を止めるかリトライする。
対応する番号:OWASP A10:2025 Mishandling of Exceptional Conditions(例外状態の不適切な処理) | CWE CWE-755 Improper Handling of Exceptional Conditions / CWE-636 Not Failing Securely | ATT&CK T1190 Exploit Public-Facing Application
AWS(5項目)
A1 セキュリティグループで 22 / 3306 などを全開放していない(優先度:高)
0.0.0.0/0 に対してSSHやDBを開けているのは、典型的な事故原因です。
確認方法
aws ec2 describe-security-groups --query "SecurityGroups[].{id:GroupId,name:GroupName,open:IpPermissions[?IpRanges[?CidrIp=='0.0.0.0/0']].FromPort}" --output table
対策:22 は社内IP・踏み台・SSM Session Managerに限定する。DBは外部に公開しない。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-284 Improper Access Control | ATT&CK T1133 External Remote Services
A2 S3 バケットが意図せず公開されていない(優先度:高)
静的サイト(CloudFront)用のバケットでも、S3を直接公開する必要はありません。
確認方法
aws s3api get-public-access-block --bucket my-bucket
aws s3api get-bucket-policy-status --bucket my-bucket 2>/dev/null
対策:Block Public Access をすべて有効にし、CloudFront OAC 経由でのみ配信する。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-284 Improper Access Control / CWE-200 Exposure of Sensitive Information | ATT&CK T1530 Data from Cloud Storage
A3 ルートのMFA・古いアクセスキーがない(優先度:高)
アクセスキーの漏えい(GitHubへの誤プッシュなど)は、すぐに悪用されてマイニングに使われ、高額な請求につながります。
確認方法
aws iam get-account-summary --query 'SummaryMap.{RootKeys:AccountAccessKeysPresent,RootMFA:AccountMFAEnabled}'
aws iam generate-credential-report >/dev/null; sleep 3; aws iam get-credential-report --query Content --output text | base64 --decode | cut -d, -f1,4,9,10,11 | column -t -s,
対策:ルートのアクセスキーは削除し、MFAを必須にする。90日以上使っていないキーは無効化する。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) | CWE CWE-798 Hard-coded Credentials | ATT&CK T1078 Valid Accounts
A4 EC2 が IMDSv2 必須になっている(優先度:中)
SSRFの脆弱性があると、IMDSv1経由でIAMの認証情報を盗まれます(Capital Oneの事件と同じパターン)。
確認方法
aws ec2 describe-instances --query 'Reservations[].Instances[].[InstanceId,Tags[?Key==`Name`]|[0].Value,MetadataOptions.HttpTokens]' --output table
対策:[変更] HttpTokens=required にする(modify-instance-metadata-options)。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-918 SSRF | ATT&CK T1552 Unsecured Credentials
A5 CloudTrail が有効で、ログが保護されている(優先度:中)
AWS上で「誰が何をしたか」を後から追える唯一の記録です。攻撃者はこれを止めようとします。
確認方法
aws cloudtrail describe-trails --query 'trailList[].[Name,IsMultiRegionTrail,S3BucketName]' --output table
aws cloudtrail get-trail-status --name "$(aws cloudtrail describe-trails --query 'trailList[0].Name' --output text)" --query IsLogging
対策:全リージョンで有効にし、保存先のバケットは削除できないように保護する。GuardDutyの有効化も推奨。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | CWE CWE-778 Insufficient Logging | ATT&CK T1685.002 Disable or Modify Tools: Disable or Modify Cloud Log
社内運用・制作会社リスク(6項目)
O1 接続情報ファイル・PCそのものが守られている(優先度:高)
制作会社のPCは、全顧客サーバーへの鍵束です(T1199 Trusted Relationship)。PCが1台漏れると、全顧客に被害が及びます。
確認方法
stat -f '%Sp %N' ~/path/to/接続情報ファイル # 所有者だけが読める -rw------- であること
fdesetup status # FileVault: On であること
/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate
対策:接続情報はパスワード管理ツールに保存する。ファイルで持つ場合は chmod 600。FileVaultとファイアウォールを有効にし、画面ロックは短く設定する。
対応する番号:OWASP A04:2025 Cryptographic Failures(暗号化の不備) | CWE CWE-312 Cleartext Storage of Sensitive Info / CWE-522 Insufficiently Protected Credentials | ATT&CK T1199 Trusted Relationship / T1552.001 Unsecured Credentials: Credentials In Files
O2 SSH秘密鍵にパスフレーズがあり、使い回していない(優先度:高)
パスフレーズのない鍵は、ファイルを1つコピーされるだけで使えてしまいます。全顧客で同じ鍵を使っていると、横展開がそのまま成立します。
確認方法
for k in ~/.ssh/id_* ~/.ssh/*.pem; do
case "$k" in *.pub) continue;; esac
[ -f "$k" ] && { ssh-keygen -y -P '' -f "$k" >/dev/null 2>&1 && echo "パスフレーズなし: $k" || echo "ok: $k"; }
done
対策:パスフレーズを付け、macOSのKeychainで管理する(UseKeychain yes)。顧客ごと、または用途ごとに鍵を分ける。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) | CWE CWE-522 Insufficiently Protected Credentials | ATT&CK T1199 Trusted Relationship / T1021.004 Remote Services: SSH / T1552 Unsecured Credentials
O3 踏み台を経由した横展開を防いでいる(優先度:高)
踏み台に他の顧客用の秘密鍵を置いたり、Agent Forwardingを常に有効にしたりしていると、踏み台1台の侵害が全体に広がります。
確認方法
grep -nEi 'ForwardAgent\s+yes' ~/.ssh/config
grep -nEi '^\s*Host \*' -A5 ~/.ssh/config | grep -i ForwardAgent
対策:ForwardAgent ではなく ProxyJump を使う。踏み台には秘密鍵を置かない。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-269 Improper Privilege Management | ATT&CK T1021.004 Remote Services: SSH / T1199 Trusted Relationship
O4 退職者・外注先・案件終了時にアカウントと鍵を削除する手順がある(優先度:高)
契約が終わった後も残っている鍵やWordPressの管理者アカウントは、そのまま裏口になります。
確認方法
# 手順書の有無を確認する。S2(authorized_keys)・W4(WP管理者)・A3(IAM)の結果と人員一覧を突き合わせる
対策:案件終了・退職のチェックリストに「SSH鍵・WPユーザー・IAM・FTP・共有パスワードの変更」を入れる。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) / A01:2025 Broken Access Control(アクセス制御の不備) | CWE CWE-284 Improper Access Control | ATT&CK T1078 Valid Accounts
O5 デプロイで作られた退避ファイル(.bak.日時)が公開領域に残っていない(優先度:高)
上書き前の退避は大事ですが、ドキュメントルート内に wp-config.php.bak.20261025 のようなファイルが残ると、PHPとして解釈されずにソースが丸見えになります。
確認方法
sudo find /var/www/html -name '*.bak*' -newermt '-180 days' 2>/dev/null | head -30
# 見つかったものに外からアクセスできるか: curl -s -o /dev/null -w '%{http_code}' 'https://example.com/<パス>'
対策:退避先をドキュメントルートの外にするか、*.bak* へのアクセスをWebサーバーで拒否する。消す場合は、必要なファイルを巻き込まないように対象を確認してから。
対応する番号:OWASP A02:2025 Security Misconfiguration(セキュリティ設定ミス) | CWE CWE-530 Exposure of Backup File | ATT&CK T1552.001 Unsecured Credentials: Credentials In Files
O6 平文のFTPを使っていない(優先度:中)
FTPはパスワードが暗号化されずに流れます。SFTPかFTPSに統一します。
確認方法
# FTPクライアント(FileZilla 等)の接続設定を1件ずつ開き、プロトコルが「FTP(暗号化なし)」になっていないか確認する
# サーバー側: 21番が開いていないか(P7 の nmap 結果)
対策:SFTP / FTPS に切り替える。サーバー側のFTP(21番)は可能なら止める。
対応する番号:OWASP A04:2025 Cryptographic Failures(暗号化の不備) | CWE CWE-319 Cleartext Transmission | ATT&CK T1078 Valid Accounts
侵入・改ざん時の初動(5項目)
I1 ①触る前に証拠を保全する(優先度:高)
慌てて削除すると、侵入経路も被害範囲も分からなくなり、顧客にも警察にも説明できません。
確認方法
# [変更] EC2: ボリュームのスナップショット
aws ec2 create-snapshot --volume-id vol-xxxx --description "incident $(date +%F)"
# ログとWebルートをまとめて手元に退避
sudo tar czf /root/evidence-$(date +%Y%m%d%H%M).tgz /var/log /var/www/html
対策:作業の記録(時刻・コマンド・発見したこと)を最初から残す。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | CWE CWE-778 Insufficient Logging | ATT&CK T1070 Indicator Removal
I2 ②被害範囲を特定する(裏口を全部見つける)(優先度:高)
Webシェル・cron・SSH鍵・ユーザー・WP管理者のどれか1つでも残ると、再び侵入されます。
確認方法
# 次の項目を順に実施: S7(不審PHP)→ S3(cron)→ S2(SSH鍵)→ S4(OSユーザー)→ W4(WP管理者)→ W1(改ざん検知)→ S9/S10(プロセス・通信)
sudo grep -hE '" (200|500) ' /var/log/{httpd,apache2,nginx}/*access*log* 2>/dev/null | grep -iE '\.php\?|/uploads/.*\.php|eval|base64' | tail -30
対策:アクセスログで最初に不審なリクエストが来た日時を見つけ、侵入経路(どの脆弱性か)を特定する。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備) | ATT&CK T1505.003 Server Software Component: Web Shell / T1053.003 Scheduled Task/Job: Cron / T1098.004 Account Manipulation: SSH Authorized Keys / T1136 Create Account
I3 ③認証情報をすべて入れ替える(優先度:高)
侵入されたサーバー上にあった秘密情報は、すべて漏れた前提で扱います。
確認方法
# 対象: DBパスワード / APP_KEY / WP認証キー(salt) / WP全ユーザーのパスワード / SSH鍵 / FTP / 外部APIキー(決済・メール・Google等) / AWSアクセスキー
対策:[変更] 入れ替えは、裏口をすべて塞いだ後に行う(先に替えても盗み直される)。
対応する番号:OWASP A07:2025 Authentication Failures(認証の不備) / A04:2025 Cryptographic Failures(暗号化の不備) | CWE CWE-798 Hard-coded Credentials | ATT&CK T1552.001 Unsecured Credentials: Credentials In Files / T1078 Valid Accounts
I4 ④同じ鍵・パスワードを使う他のサーバーを確認する(優先度:高)
制作会社で一番怖いのは、そこから他の顧客へ広がることです。
確認方法
# 侵害されたサーバー上の ~/.ssh/known_hosts・~/.ssh/config・.env の接続先を確認し、そこへのログイン履歴(S5)を確認する
sudo cat /root/.ssh/known_hosts /home/*/.ssh/known_hosts 2>/dev/null | awk '{print $1}' | sort -u | head
対策:関連するサーバーでも S2〜S7 を実施する。
対応する番号:OWASP A01:2025 Broken Access Control(アクセス制御の不備) | ATT&CK T1021.004 Remote Services: SSH / T1199 Trusted Relationship
I5 ⑤顧客報告・法令上の報告(優先度:高)
個人情報が漏えいした(おそれがある)場合、個人情報保護委員会への報告と本人への通知が義務になる場合があります(速報は概ね3〜5日以内、確報は30日以内。不正アクセスによる場合は60日以内。詳細は個人情報保護委員会のガイドラインを確認)。
確認方法
# 報告書の骨子: 発見日時 / 侵入経路(ATT&CK・CWE で記載) / 影響範囲 / 実施した対処 / 再発防止策
対策:顧客とは契約上の連絡窓口を通じて、すぐに第一報を入れる。報告書には本チェックリストのIDやATT&CK・CWEの番号を使う。
対応する番号:OWASP A09:2025 Security Logging and Alerting Failures(ログ・アラートの不備)
制作会社・保守会社ならではのリスク
checksecには、一般的なチェックリストにはあまり載っていない区分として「社内運用・制作会社リスク」を入れています。
制作会社や保守会社のPCには、多くのお客さまのサーバーに接続するための情報や鍵が集まっています。ATT&CKでは、取引先や委託先との信頼関係を足がかりにする攻撃を T1199 Trusted Relationship として整理しています。制作会社のPCが1台侵害されると、そこからすべてのお客さまに被害が広がるおそれがあります。
そのため、次のような点を点検項目にしています。
- SSH秘密鍵にパスフレーズが付いているか、お客さまごとに鍵を分けているか
- 踏み台サーバーに秘密鍵を置いていないか、Agent Forwardingを常に有効にしていないか
- 退職者や外注先、契約が終わった案件のアカウント・鍵を削除する手順があるか
- 接続情報のファイルやPCのディスクが暗号化されているか
Webサイトの運用を外部に委託している企業の方は、委託先がこうした管理をしているかを確認する材料としても使えます。
使い方
- ZIPをダウンロードして展開し、
checksec.htmlをお手元のブラウザで開きます。 - 上部に「対象名」(サーバー名やサイト名)とURLなどを入力すると、確認コマンドの中の値がその内容に置き換わります。
- まず優先度「高」だけに絞って、1項目ずつ「OK / NG / 対象外」を付けていきます。NGの内容はメモ欄に残します。
- 「結果をMarkdownでコピー」で、点検結果をテキストとして取り出せます。報告書や作業記録にそのまま貼り付けられます。「印刷/PDF」にも対応しています。
- 「対応表」タブで、OWASP Top 10の各カテゴリ、ATT&CKの各戦術に、どのチェック項目が当たるかを一覧できます。
チェック結果は対象名ごとにブラウザ内に保存されるため、複数のサイトやサーバーを並行して点検できます。
ご利用にあたっての注意
- ご自身が管理する環境、または管理者から許可を得た環境でのみご利用ください。他人のサーバーへの無断のポートスキャンや脆弱性の調査は、不正アクセス禁止法などの法令に触れるおそれがあります。
- 掲載しているコマンドは、原則として設定やファイルを変更しない、確認用のものです。対策の欄で
[変更]と書いている作業は、バックアップを取ったうえで、検証環境で試してから本番に反映してください。 - 本チェックリストは一般的な点検の参考情報です。すべての脆弱性を発見できることを保証するものではありません。
まとめ
セキュリティ対策は、「何を確認するか」を決めて、定期的に同じ観点で見直すことから始まります。
- OWASP Top 10とCWEで、Webアプリの脆弱性を漏れなく拾う
- ATT&CKで、侵入されたあとの攻撃者の行動まで点検の範囲に入れる
- 3つの番号を報告書に添えて、関係者と同じ言葉で話せるようにする
checksecは、そのための土台として自由にお使いいただけます。社内での点検や研修の資料としても活用してください。
合同会社FIELDでは、このチェックリストに載せた点検と、見つかった問題の改修のすべてに対応できます。 WordPress・Laravelの脆弱性診断、サーバーやAWSの設定見直し、改ざん被害の調査と復旧、保守体制づくりまで、一貫してお手伝いします。
「チェックしてみたらNGが多かった」「どこから手を付ければよいか分からない」という場合も、お気軽にご相談ください。
関連記事
- 個人情報はなぜ流出するのか|言語・フレームワークを問わない攻撃の仕組みと対策
- セキュリティ事故他社事例弊社が解決したケース
- PHP2Shell 修正パッチを読み解く|CVE-2026-109618 / 109619 で本当は何が壊れ、何が直ったのか(WordPress運用者向け)
参考にした資料
- MITRE ATT&CK®(Enterprise v20。戦術・技術IDは2026年10月25日に照合)
- OWASP Top 10:2025
- CWE(Common Weakness Enumeration)(掲載したCWE番号45件は、2026年10月25日に公式APIで名称を照合)
- 個人情報保護委員会「個人情報の保護に関する法律についてのガイドライン(通則編)」