防范恶意注入需从执行环境、调用方式和脚本可信性三方面入手:严格限制脚本类型与存放路径,杜绝命令拼接与高危执行模式,落实用户隔离与最小权限,确保日志可追溯及脚本完整性校验。

防范恶意注入,关键在于切断脚本被“误调用”或“被篡改后仍能执行”的路径。不是只防输入,更要管住执行环境、调用方式和脚本本身是否可信。
严格限制脚本类型与存放位置
多数定时任务系统(如Cronsun、Whenever、Node-Cron)支持扩展名白名单。默认只允许 .sh 和 .py,禁用 .php、.pl、.rb 及无扩展名脚本。所有脚本必须存放在受控目录,例如 /opt/scripts/ 或 /usr/local/bin/,严禁从 /tmp、/var/www、用户家目录等非受信路径直接调用。
- Cronsun 中通过
"ext": [".sh", ".py"]配置生效 - Whenever 需在
schedule.rb中统一管理路径,避免动态拼接 - systemd timer 或传统 cron 中,命令字段必须写全路径,不依赖 PATH 查找
杜绝命令拼接与高危执行模式
任何含用户输入、变量或运行时参数的命令,都不能用字符串拼接构造。比如 exec("curl " + url) 或 bash -c "$cmd" 是典型风险点。
- Shell 脚本中启用
set -u(未定义变量报错)和set -e(任一命令失败即退出) - 数值参数强制转整型并设合理范围,如小时值限定在 0–23
- 字符串参数走正则白名单匹配,例如只允许字母、数字、下划线和短横线
- 绝对禁止
sh -c、eval、curl | sh、wget -O- | sh、base64 -d | sh等模式
执行用户隔离与最小权限落地
绝不使用 root 或部署账号直接跑任务。应为每类任务创建专用低权用户,如 cron-backup、cron-sync,仅授予其访问对应目录、配置文件和必要二进制文件的权限。
- 脚本自身权限设为
755,属主为专用用户,非 root - crontab 中显式用
sudo -u cron-backup /opt/scripts/backup.sh - Cronsun 在
security.json中配置"users": ["cron-backup"] - Whenever 在 Capistrano 部署配置中指定
set :whenever_command, 'sudo -u cron-backup bundle exec whenever'
日志可追溯 + 脚本可信验证
每条任务执行都必须记录完整命令、用户、退出码、耗时及标准输出/错误,并重定向到受保护日志路径(如 /var/log/cron-jobs/)。日志文件建议用 chattr +a 锁定,防止覆盖。
- 用
auditctl监控/etc/crontab、/etc/cron.d/等关键路径变更 - 对异常行为设置告警:非工作时间触发、解释器从
/tmp调起、同一任务1小时内失败超3次 - 对脚本本身做完整性校验:部署时生成 SHA256 哈希,运行前比对;高敏感场景可用 GPG 签名验证











