0%

安全编码专项笔记

本帖主要记录安全编码需要注意的一些东西,后续可能补充一些案例

一、注意项

1. 设计相关

1.1. 系统设计

1. 服务开放

  • 所有新增服务需要考虑按需开放,如果没有使用或者配置没有开启,就不要让服务运行,并且把端口用防火墙关闭
  • 所有端口封锁,仅需要开的端口才打开
  • ssh连接不要一直开放,最好设置某些规则后才能连接
  • 不要相信客户端,最好有一个ssl双向认证的机制,在某个可信的连接将证书下发,后续连接校验此证书

2. 命令执行

  • 权限尽可能收缩,给代码加钩子只允许代码执行系统极个别命令

其他

  • 看情况在后台留一个后门,用于上报各种信息给服务器,服务器根据信息判断是否被攻击或者篡改等(对于安全要求高的客户),同时可以做一个全量统计

1.2. 模块设计

1. 外部接口考虑暴力破解或者枚举

  • 外部调用的请求之类的接口,要注意鉴权方式。考虑有没有可能通过枚举暴力破解的方式,扫描出一些敏感信息。
  • 正常和异常不要有明显的处理时间的不一致,会导致根据返回时间判断是否是正确的用户名等

2. 用户名权限等篡改

接口设计如果有外部输入用户名权限等信息,如果鉴权不够强,可能导致修改绑定的用户名,从而导致数据泄露和权限泄漏

3. 精细化授权

  • 管理员需要分级的对每一个模块有读或者读写授权,接口单独分为读接口和写接口,角色创建可以选择不同接口的读写权限
  • 授权判断需要走统一入口,防止绕过

4. 密码管理

  • 秘钥密码等在数据库储存不能明文,需要原文的可逆加密,不需要的不可逆加密
  • 禁止将密码原文存放到磁盘
  • 一种解决方案: 使用一个随机文本作为加解密的二进制,使用二进制加密密码,将密文存放磁盘,代码中进行解密使用

2. 编码相关

  • 外部输入需要考虑大小问题,是否可能越界
  • 外部输入是否可能存在特殊字符
  • sql注入
  • xml注入
  • 编译型二进制必须strip,脚本型能混淆尽量混淆

二、威胁应对参考设计方案

1. 枚举暴力破解

接口校验参数格式固定,有可能被暴力循环扫描来枚举出信息,可参考以下方案解决

  1. 必须在线用户可发请求到接口,session机制
  2. 数据整体使用特殊算法生成一个hashid,服务端校验hashid对上才处理数据
  3. ip防爆破检测
  4. 前端加ddos防攻击设备

2. 用户名权限等篡改

接口有外部输入用户名权限等数据时,可能出现被篡改数据,可参考以下方案解决

  1. 用户名除了登录时需要外部输入进行校验,其余放入在线信息中,外部通过session关联链接,从其中获取用户名和权限,不从外部输入
  2. 内部接口则限制ip仅为127.0.0.1

三、主动防御方案

1. 资源诱饵欺骗

  • 在内网设置蜜罐,发布一些假资源,暴露假的账号密码。登陆时抓到攻击者