安全排查
1:防踩坑知识点之 time.After
Timer 不会被 GC 回收直到它被触发,如果需要考虑效率的话,Timer 不再被需要时,需要主动调用 Timer.Stop。
2: 对文件路劲进行标准化处理: filepath.abs()
filepath.Abs() 函数返回绝对路径,删除了所有符号链接。同时对文件路径是否在安全目录的验证也是至关重要的,可以防止黑客通过构造文件路径指向系统的关键文件。
未标准化的影响: 当path为/opt/pwm/../../../etc: 这样就可以绕过文件校验(开发者可能会对文件名做正则匹配的校验, 这时候会失效)
3: unsafe.Pointer转成uintptr时,需要确保内存被引用,否则会被gc回收。
如下代码,uintptr是值不是指针,如果gc发生在pX := (*X)(unsafe.Pointer(tmp))之前,那么tmp对应的内存会被回收,并可能分配给别人,pX.b = 42,就会踩别人使用的内存。
【编码规范要求】
除指定的例外情形外,禁止使用uintptr与unsafe.Pointer编写函数。无分别的对所有的业务
功能使用cgo代码,将带来内存管理的相关问题。 禁止的例子,如:用于处理网络数据的库函数接口
中,参数大量的使用uintptr接收缓冲区输入。正确的方式,使用[]byte。
【例外情况】:
1、调用 C 函数库
需要使用 C 实现的函数库提供的接口和功能,使用系统的已有 C 函数库的代码。如访问底层的硬件驱
动,调用(驱动的) C 函数库的相关代码,访问sqlite数据库。
2、算法优化
此算法需要使用 C 代码实现更高效的处理。
3、必要的内存计算处理
一般用在调试代码,或者系统的漏洞分析代码中。
4、调试代码
可能需要用于计算或显示内存位置用于定位发现问题。
5、存储对象的句柄
如文件对象、进程对象、错误号等的句柄。
同时建议: Go 调用 C 函数库,不能在所有地方调 C 的函数实现,需使用Go封装此类 C 函数,调用封
装的 Go 函数。
4: 检测代码是否有公网ip地址或者email地址等信息
"直接通过正则表达式借助IDE(例如VsCode)搜索代码: 1.使用正则表达式:[\w-.]{0,100}@(?:(?:[([0-9]{1,3}?.){3})|(?:(?:[a-zA-Z0-9-]+.)+))(?:[a-zA-Z]{2,4}|[0-9]{1,3})]? 搜索代码"
5:二进制提权
setcap和getcap