安全排查

82 阅读2分钟

安全排查

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,就会踩别人使用的内存。

image.png 【编码规范要求】

除指定的例外情形外,禁止使用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