研发安全检查项(DevSecChecklist,Development Security Checklist)
开发人员视角如何研发出安全的应用?
服务开放(包含域名、IP、端口、服务、接口等)
原则:仅暴露所需访问范围(服务暴露面的收窄,能有效减少被攻击面)
- 禁止向互联网暴露除443/80以外的端口,禁止出现HTTP[S]以外的协议,能极大降低各类服务被攻击的情况。
- 建议全站使用HTTPS协议,避免信息在传输过程中泄露。
- 建议HTTPS开启HSTS,防止中间人攻击。
- 建议修改服务器配置禁用TLS1.2。
- 禁止将管理后台开放到互联网可访问,建议限制只能固定来源IP可访问,能最大降低后台的被攻击面。
- 禁止公网域名与内网域名混用,建议分开使用不同域名或不同后缀。
- 建议已不再使用的域名、IP、端口、API接口,需要及时下线。
认证鉴权(包括注册、登录、密码等)
原则:任何服务调用都需要认证鉴权(暴露的服务做好认证鉴权,守住入口就成功了一半)
- 禁止出现无需登陆即可使用的管理后台,以避免未授权访问漏洞。
- 禁止无需登陆认证即可使用的服务,包括VPN、代理、数据库、管控台等,以避免未授权访问漏洞。
- 禁止自己检测密码强度,建议使用校验使用标准库。
- 禁止传输明文密码,建议密码通过不可逆算法加密后传输后端。
- 禁止明文储存用户密码,不要使用可还原密文的加密算法储存用户密码,使用Bcrypt。
- 建议用户注册时需校验手机验证码。手机号码带需要实名,侧面要求注册账户都要实名,从而能增加垃圾注册账户的成本。
- 建议用户登录注册环节增加人机识别验证码。
- 建议用户登陆时限制密码错误次数,增加账号冻结功能。
- 建议新设备或异地登录时需要校验短信验证码。
- 建议登陆和注册接口增加频率限制,以避免攻击者通过枚举手机号来查询是否注册本网站。
- 建议会话的Cookie增加HttpOnly选项。能有效防止XSS漏洞盗取你的登录态,从而控制你账户。
- 建议会话的Cookie增加超时时间。
- 建议会话的Cookie增加SameSite选项,以避免CSRF漏洞。
- 建议Cookie开启Secure选项,可使HTTP无法传输Cookie,避免被三方嗅探到。
- 建议修改密码后,清除该账户所有存活的登录会话。
- 建议用户退出登录时,清除其对应端(PC端或移动端)全部历史登录态。
- 建议修改账户关键信息时(手机号、邮箱、密码等)应通过邮箱和短信通知对方。
- 禁止使用Basic Auth,建议使用JWT、OAuth2。
- 禁止自己生成Token,建议使用通用产品生成。
外部数据输入
原则:外部数据均不可信,需严格检查限制(外部传入的各类文件、文本、链接等都会导致高危安全风险,进行严格限制可避免出现重大安全问题)
文件操作(包括上传、解析、下载)
- 上传
- 建议上传时,清除用户提供的文件名,以避免文件名中包含恶意信息导致XSS、文件覆盖等风险。
- 建议上传如果是图片文件,应清除图片EXIF信息。以避免用户敏感信息通过图片的EXIF泄露。
- 禁止上传exe、dmg、pkg、py、sh、jar、php、jsp、java、html等脚本语言文件,建议文件上传时仅允许上传指定后缀格式文件,以避免任意代码执行风险。
- 禁止上传超过预设大小文件,建议文件上传时检查文件大小。以避免出现恶意上传大文件,占满磁盘导致拒绝服务风险。
- 建议文件上传至CDN、OSS,而不要存在本地。
- 下载
- 禁止通过访问某个文件路径进行文件下载,以避免任意文件下载漏洞。
- 建议文件下载时,检查文件是否归属当前登录用户,以避免任意文件下载漏洞。
- 解析XML时
- 禁止开启实体解析(entity parsing),以避免 XXE 攻击。
- 禁止开启实体扩展(entity expansion),以避免通过指数实体扩展攻击实现的 Billion Laughs/XML bomb。
储存或展示用户提供的信息(包括文本、图片、视频等)
- 禁止用户提供的文本内容不做安全过滤就直接储存,建议增加XSS过滤,避免XSS漏洞。
- 建议在用户发送的消息可影响他人的场景下(发送短信、站内信、动态等)限制消息发送频率,避免消息轰炸漏洞。
- 建议对应内容若展示给公众,且为用户提交,则需要接入内容审核机制,避免黄赌毒等违法内容。比如发表文章、短信备注、内容评论等。
- 建议对敏感多媒体内容(图片、视频等)的展示不放在CDN中,而是通过API接口包一层判断用户是否有权限后展示。
解析用户提供的链接对应的内容
- 禁止对入参中域名链接直接发起请求,建议发起请求前限制域名白名单和请求协议、关闭默认跟随跳转等,以避免SSRF漏洞。
- 建议当存在入参中的域名进行页面跳转时,严格设置跳转域名白名单,避免出现URL任意跳转漏洞。
命令或代码执行
- 禁止开放代码或命令执行、SQL执行等功能供用户使用,必要使用场景需严格限制使用人员权限并增加使用审批流程以及增加沙箱和隔离机制。
算法(Hash、加解密等)
- 禁止使用MD5、MD4、MD2等Hash算法,不推荐使用SHA-1,推荐使用SHA-128及以上,建议使用SHA-256、SM3。
- 禁止使用DES、RC4、Blowfish等加解密算法,建议使用3DES、AES、SM4。
数据处理(包括数据查询、传输、保存、展示等)
原则:数据仅可被所有者或被授权者查看,敏感数据使用应脱敏及存储应加密。
- 禁止在访问数据时,不检查数据的所有者和当前登陆者是否一致或相关。
- 禁止将未被用到的信息或字段展示在响应包中。
- 禁止直接明文返回任何敏感数据,所有敏感数据展示必须脱敏。
- 禁止在日志中打印敏感信息。
- 禁止在Cookie、localStorage等前端环境中存放明文敏感信息。
- 禁止拼接SQL、使用非参数化方式查询数据库,避免SQL注入漏洞。
- 建议敏感数据加密存储。
- 建议敏感信息展示时增加水印。
- 建议敏感信息的查询都需要记录日志,时间、操作者、被查询者。
逻辑处理(包括流程、分支、并发、状态等)
原则:应做好健全的逻辑分支,提前考虑各种极端用户行为。
- 建议在流程逻辑中,要在每一步校验前面所有步骤是否完成,避免流程被绕过。
- 建议更改某个产品逻辑时,确保不同端(App、Web、H5等)以及不同协议(HTTP、REST、GraphQL等)相同功能的逻辑保持一致。
- 建议做好事务原子性处理,避免并发导致突破规则。
- 建议耗时长的逻辑应做成异步,避免拒绝服务攻击。
后端配置
- 禁止代码中硬编码任何类型密钥。
- 禁止在生产环境打开DEBUG模式
- 禁止将异常堆栈信息透出给用户
- 禁止使用GET请求进行增、删、改操作,建议使用POST,以缓解CSRF漏洞。
- 禁止在生产环境Web目录下存放和代码无关的文件(包括压缩文件、.svn/.git、日志文件等)
- 禁止当使用CORS作为跨域访问时,将Access-Control-Allow-Origin设置为*,以避免CORS任意域访问漏洞。
- 建议使用合理的HTTP状态码。
- 建议删除含有版本或软件信息的响应头,比如X-Powered-By,Server,X-AspNet-Version等信息
- 建议响应头中增加X-Content-Type-Options: nosniff、X-Frame-Options: deny、Content-Security-Policy: default-src ‘none’
- 建议所有资源ID加密后透出,加解密逻辑仅在后端存在,包括(UID、OrderID等),以缓解水平越权等漏洞影响。
- 建议使用UUID替代自增ID。
APP
- 禁止在用户未同意隐私协议前获取用户相关信息
- 建议不在App中硬编码任何秘钥
邮箱
- 建议添加SPF,防止垃圾邮件和网络钓鱼攻击
日常生活
- 禁止点击运行任何人通过任何方式发送文件,尤其是exe、jar、apk等可直接执行的文件。包括面试者简历中作品、伪装成提醒你更新软件等。
- 禁止将含有敏感信息(密码、秘钥、硬编码URL等)的代码上传至GitHub等平台。
- 禁止使用弱口令,建议不要多个网站密码一样,密码大小写字母、数字和字符组合大于6位。
- 禁止离开电脑时不锁屏。
- 禁止从论坛、博客、某某下载站下载软件,建议从App Store、官方商店、官方网站下载软件。
- 禁止使用破解软件、注册机等,这是恶意软件高发区。
- 禁止猜测依赖名进行安装,建议查询依赖名称后安装。
- 禁止让他人U盘直接插在自己电脑上。
- 禁止在本机0.0.0.0上启动任何端口服务。
- 建议开启各个网站二次认证功能。
- 建议微信发送图片或各类平台上传图片时勿选择原图,会将图片中的EXIF信息(包括拍摄设备、拍摄地点GPS、拍摄时间等)泄漏出去。
- 建议及时更新系统及软件到最新版本(系统和软件每次更新都会修复大量漏洞,及时更新系统和软件版本能减少被攻击的时间窗口)。
- 建议从官方源下载软件依赖。
- 建议不要连接陌生Wi-Fi,连接陌生Wi-Fi时不要访问敏感网站(链接模式Wi-Fi的一举一动都被监视着)。
- 建议Wi-Fi中开启防蹭网,确保每一个连接的设备都已知。
- 建议手机App中禁止后台获取当前位置权限。
拥抱安全社区
- 建议有条件的建立一个类似TSRC对外漏洞和情报收集平台,可以使用TSRC开源系统搭建。没有条件建议在官网“联系我们”中放置一个电子邮件security@feei.cn,供安全人员报告漏洞
- 建议善意对待安全人员报告的漏洞或情报,但要详查所有操作看报告内容是否有所保留以及越界。
- 建议确定存在的漏洞或情报,有条件的可以参照TSRC标准奖励现金,没有条件的可以赠送一些小礼物。
- 建议参与一些安全会议,了解最新安全风险和技术趋势。
https://github.com/Tencent/secguide/blob/main/Java%E5%AE%89%E5%85%A8%E6%8C%87%E5%8D%97.md
安全Checklist
https://github.com/FallibleInc/security-guide-for-developers/blob/master/README-zh.md