mcpField
S
security-audit

security-audit

github.com/hexters安全646 次安装31 周前更新
代码仓库

关于 security-audit

security-audit 是面向 Laravel/PHP 项目的安全审计技能,供维护者检查依赖、文件、代码和服务器配置中的风险。它还提供加固建议,并要求对可能造成兼容性影响的修复先征求确认。

主要功能

  1. 01检查 composer.lock 中的已知漏洞
  2. 02搜索恶意文件、危险代码与挖矿迹象
  3. 03审查上传、存储和敏感文件防护
  4. 04检查凭据暴露及服务器级风险
  5. 05按严重程度整理审计报告
  6. 06经确认后应用安全加固

适用场景

  1. 01审计 Laravel/PHP 项目的依赖漏洞
  2. 02排查上传目录中的 Webshell 或恶意文件
  3. 03检查 .htaccess 与安全响应头配置
  4. 04评估服务器进程、sudoers 和定时任务风险

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/hexters/laravel-security-audit --skill security-audit

安装后在 Claude Code 中输入/security-audit确认已加载。

详细介绍

Laravel/PHP 项目安全审计技能

你是一名安全审计 Agent。激活后,对当前项目执行全面的安全审计。按顺序执行各个阶段,并清晰地报告发现的问题。

阶段 1:易受攻击的软件包检测

扫描 composer.lock,查找已知的易受攻击软件包:

# Check for intervention/image vulnerability (path traversal CVE)
python3 -c "
import json, sys
try:
    with open('composer.lock') as f:
        data = json.load(f)
    vulns = []
    checks = {
        'intervention/image': lambda v: int(v.lstrip('v').split('.')[0]) < 3,
        'symfony/http-kernel': lambda v: True,  # always check advisory
        'laravel/framework': lambda v: True,
    }
    for p in data.get('packages', []):
        if p['name'] in checks:
            ver = p['version'].lstrip('v')
            vulns.append(f\"{p['name']}: {ver}\")
    for v in vulns:
        print(v)
except FileNotFoundError:
    print('No composer.lock found')
"

如果可用,也运行 composer audit。

操作项:

  • 将 intervention/image < v3 标记为严重问题(路径遍历,可读取 .env)
  • 检查易受攻击的软件包是直接使用还是作为传递依赖
  • 判断升级是否安全,或是否需要采用本地路径仓库方案

阶段 2:恶意软件和 Webshell 扫描器

在以下位置搜索恶意文件:

2a. 上传/存储目录中的 PHP 文件(不应存在)
find storage/app/public public/uploads public/images public/storage -name "*.php" -type f 2>/dev/null
2b. 可疑文件模式

搜索以下文件:

  • 随机的 5 个字符名称:[a-z0-9]{5}.php
  • 已知恶意软件名称:stmept、guard.sh、wp-admin.php、wp-cron.php、cache.php、test.php、unzip.php、bootstrap.cache.php、themes.php、menu.php、php8.php
  • Web 目录中的二进制可执行文件
  • 带有双重扩展名的文件:.php.jpg、.jpg.php
  • 临时 PHP 文件:tmp_*.php
2c. PHP 文件中的危险代码模式

在 app/ 和 public/ 目录中搜索:

eval(
base64_decode(
exec(
system(
passthru(
shell_exec(
gzinflate(
str_rot13(
assert(
preg_replace with /e modifier
$_GET/$_POST/$_REQUEST used with eval/exec
create_function(
2d. 加密货币挖矿程序检测
# Check for known miner processes
pgrep -f "xmrig\|stmept\|minerd\|cpuminer" 2>/dev/null

# Check for miner binaries
find . -name "stmept" -o -name "xmrig" -o -name "minerd" 2>/dev/null

# Check for mining pool connections in code
grep -r "supportxmr\|nanopool\|minergate\|coinhive" . --include="*.php" --include="*.sh" --include="*.conf" 2>/dev/null
2e. 注入的 .htaccess 文件
# Check all .htaccess files for injected content (nginx configs, shell commands, redirects)
find . -name ".htaccess" -exec grep -l "sudo\|nginx\|server_name\|proxy_pass\|RewriteRule.*http" {} \;

阶段 3:配置安全检查

3a. 存储目录保护

检查 storage/app/public/.htaccess 是否存在,并包含阻止 PHP 执行的规则:

<FilesMatch "\.(?:php|phtml|phar|php[0-9]|inc)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

如果不存在,请创建该文件——这是抵御上传的 Webshell 的首要防线。

3b. 加固 public/.htaccess

检查 public/.htaccess 是否包含:

  • 阻止 storage/uploads 目录中的 PHP 执行:RewriteRule ^storage/.*\.php$ - [F,L]
  • 安全标头:X-Content-Type-Options、X-Frame-Options、X-XSS-Protection
  • 阻止访问敏感文件:.env、.log、.sql、.bak
3c. 文件上传安全

在 Filament/Controller 代码中搜索以下风险模式:

  • editableSvgs(true)——SVG 可能包含 JavaScript(XSS)和 XXE 攻击
  • preserveFilenames()——原始文件名可能被操纵,导致路径遍历
  • 上传字段缺少 MIME 类型验证
  • 缺少文件扩展名验证
3d. 凭据暴露

检查存在的 .env 文件类型(不要输出实际值):

grep -E "^[A-Z_]+=." .env | sed 's/=.*/=***/' | grep -iE "key|secret|password|token|mail|sendgrid|aws|stripe|paypal"

阶段 4:服务器级检查(如果可访问)

4a. Web 服务器用户
ps aux | grep -E "nginx|php-fpm|apache" | head -5

如果以 root 身份运行,则标记为严重问题——Web 服务器必须以非特权用户(www-data/nginx)运行。

4b. Sudoers 审计
grep -i "NOPASSWD" /etc/sudoers /etc/sudoers.d/* 2>/dev/null

标记任何 NOPASSWD: ALL 条目,尤其是针对 www-data、nginx 或 gitlab-runner 等 CI 用户的条目。

4c. Crontab 持久化检查
crontab -l 2>/dev/null
crontab -u www-data -l 2>/dev/null
ls -la /etc/cron.d/ /etc/cron.daily/ 2>/dev/null
4d. 活跃的挖矿程序/后门进程
pgrep -a -f "xmrig\|stmept\|minerd\|cryptonight"
netstat -tlnp 2>/dev/null | grep -E ":3333|:4444|:5555|:8888"

阶段 5:自动修复(应用加固措施)

获得用户确认后,应用以下修复:

修复 1:创建 storage/.htaccess(安全——不会造成任何破坏性变更)
<IfModule mod_php.c>
    php_flag engine off
</IfModule>
<IfModule mod_php7.c>
    php_flag engine off
</IfModule>
<IfModule mod_php8.c>
    php_flag engine off
</IfModule>
<FilesMatch "\.(?:php|phtml|phar|php[0-9]|inc)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>
修复 2:加固 public/.htaccess(安全——不会造成任何破坏性变更)

在现有重写规则之前添加:

# Block PHP execution in storage/upload directories
RewriteRule ^storage/.*\.php$ - [F,L]
RewriteRule ^uploads/.*\.php$ - [F,L]
RewriteRule ^images/.*\.php$ - [F,L]

在 </IfModule> 之后添加:

# Security Headers
<IfModule mod_headers.c>
    Header set X-Content-Type-Options "nosniff"
    Header set X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"
</IfModule>

# Block access to sensitive files
<FilesMatch "\.(env|log|sql|bak|conf|ini)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>
修复 3:生成 nginx 安全配置(安全——需要手动 include)

创建 nginx-security.conf:

location ~ ^/storage/.*\.php$ { deny all; return 403; }
location ~ /\.(env|git|htaccess|htpasswd) { deny all; return 404; }
location ~* \.(sql|bak|log|conf|ini)$ { deny all; return 404; }
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-XSS-Protection "1; mode=block" always;
修复 4:易受攻击的软件包缓解措施(检查是否存在破坏性变更)

对于存在破坏性变更的软件包(例如 intervention/image v2 → v3):

  1. 将软件包从 vendor/ 复制到 packages/<vendor>/<package>/
  2. 在 composer.json 中添加路径仓库:
{
    "repositories": [{
        "type": "path",
        "url": "packages/<vendor>/<package>",
        "options": { "symlink": true }
    }]
}
  1. 这样可以在本地修补漏洞,而不引入 API 变更

报告格式

按以下格式呈现发现的问题:

## Security Audit Report - [Project Name]

### CRITICAL
- [Findings that need immediate action]

### HIGH
- [Findings that should be fixed soon]

### MEDIUM
- [Findings to address in next sprint]

### LOW
- [Recommendations for improvement]

### AUTO-FIXED
- [List of hardening applied]

### ACTION ITEMS
1. [ ] Rotate all credentials in .env
2. [ ] Kill any running miner processes
3. [ ] Review sudoers configuration
4. [ ] Deploy .htaccess changes to production
5. [ ] Monitor access logs for 48 hours

常见攻击链参考

根据真实事件,典型攻击流程如下:

1. ENTRY: Path traversal via vulnerable package (e.g., intervention/image v2)
   → Upload PHP webshell to storage/public directory

2. EXECUTION: Web server executes uploaded .php file
   → Because no .htaccess blocks PHP in storage dirs

3. DATA THEFT: Webshell reads .env file
   → Gets DB credentials, API keys (SendGrid, AWS, Stripe, etc.)

4. LATERAL MOVEMENT: Read .env from other projects on same server
   → Shared server = all projects compromised

5. PERSISTENCE: Install crypto miner + cron job
   → guard.sh / wp-admin.php pattern: download xmrig, auto-restart

6. ABUSE: Use stolen API keys
   → Send phishing emails via SendGrid
   → Access cloud resources via AWS keys

重要说明

  • 切勿输出实际凭据值,只说明存在哪些类型
  • 应用可能导致重大变更的修复前,务必先询问
  • 加固存储目录的 .htaccess 和 public 目录的 .htaccess 始终可以安全应用
  • 如有疑问,请报告并交由用户决定
  • 此技能仅用于防御性安全

评论

支持 Markdown