Google 孵化了 3 个 Go 安全库,推荐使用!(1)

  • SafeOpen[2]:用于打开目录中的文件,指的是对标 os.Open 等的安全增强。
  • SafeArchive[3]:用于处理归档文件,指的就是压缩文件的处理,对标 archive/tararchive/zip 等的安全增强。

解决了什么问题

这些库经过精心设计,可应对常见的安全攻击,可以防范 CWE TOP25 中的以下弱点:

ea974b8cced99c448534a6494b805c84.png

  • #5 CWE-78[4]:操作系统命令中使用的特殊元素中和不当(操作系统命令注入)。
  • #6 CWE-20[5]:特殊情况下,输入验证不当。
  • #8 CWE-22[6]:对受限目录的路径名限制不当(路径遍历)。

这几个 Safe 系列库提供了强大的保护机制。只要使用这几个库,即使输入是由攻击者输入的,也能以无漏洞的方式执行这些基本的系统操作。

库使用和案例

SafeText

SafeText 库,是 2023 年初发布的第一个安全库的家族成员。

Google 要创造这一库的原因是:内部在使用 text/template 做开发基于 YAML 的应用程序时,经常受到 YAML 注入的攻击。

YAML 模板

SafeText 库被设计为 text/template 的直接替代品。我们可以用它来处理 YAML 模板,就像使用 text/template 一样。

两者不同的地方是:当检测到注入时,SafeText 库会返回错误。

以下是例子,假设模板如下:

---
sensitive: data
innocent: "{{ .input}}"

当使用 text/template 时,如果攻击者控制了 .input 的值,他们就可以注入换行符,覆盖其他字段或更改文档结构。

根据不同的使用情况,影响可能是严重的。例如:当变更的结果被用作生产系统的配置文件时。

如果是使用 SafeText 库时,SafeText 将返回错误信息:YAML Injection Detected,,并阻止这类可能的侵入式攻击。

Shell 命令模板

在该库原有 YAML 功能的基础上,Safe 库还增加了对 shell 命令模板的支持。

设计上考虑的是:确保输入字符串不会被注入额外的命令或标志,而不考虑潜在的错误转义。(保证安全,接受部分错误的可能)

以下是例子,假设易受攻击如下:

result := fmt.Sprintf("git commit -m %s", message)

如果信息变量受攻击者控制,且连接字符串在某个时刻被执行,那么这就是一个漏洞。

根据攻击的具体执行情况,操作系统命令或可执行文件(本例中为 git cli)的参数都可能被注入。

如果使用 Safe 库提高的 shsprintf 系列函数,例如:

message := "`脑子进煎鱼了...`"
result, err := shsprintf.Sprintf("git commit -m %s", message)

或是:

message := "`煎鱼进脑子了`"
result := shsprintf.MustSprintf("git commit -m %s", shsprintf.EscapeDefaultContext(message))

两个例子都能检测到注入尝试。第一个会返回错误,第二个则会引起恐慌。可以有效起到防护的作用。

SafeOpen

SafeOpen 库的设计目的是:防止路径遍历攻击,它通过提供在基本目录内打开文件的函数来实现这一目的。

其原理很简单:需要你指定一个受信任的根目录,该库就会强制要求文件操作不能超出该目录。

保护的缘由是:当要打开的文件路径名受攻击者控制(这意味着它可能包含 ./ 路径组件)或根目录 “不干净”(例如它包含符号链接)时,它就能提供强大的保护,因为无法跨过你所指定的目录范围。

SafeOpen 库的使用例子,如下代码:

rootDir:= "/data"
f, err := safeopen.OpenBeneath(rootDir, userInput)
if err != nil {
    t.Fatalf("OpenBeneath(%q, %q) error: %v", rootDir, userInput, err)
}
// ... use f as an *os.File just like before

该库对标以下几个函数:

  • os.Open
  • os.OpenFile
  • os.Create
  • os.ReadFile
  • os.WriteFile
SafeArchive

SafeArchive 库的设计目的是:防止路径遍历攻击(又称 zip slip)以及与处理归档文件相关的各种攻击

该库可直接替换 Go 标准库中的的 archive/tar 和 archive/zip,直接换包的导入路径就可以了。使用后,压缩包中如果包含恶意信息,发现后将会被清除。

例子如下:如果该库遇到包含恶意条目 ./././././etc/cron.daily/cronjob 的 .zip 文件,该库会清理该名称,并返回为干净的 etc/cron.daily/cronjob

代码如下:

tr := tar.NewReader(buf)
tr.SetSecurityMode(tr.GetSecurityMode() | tar.SanitizeFileMode | tar.DropXattrs)

另外还支持了许多额外保护措施,例如:跳过特殊文件、净化文件权限、净化文件名、防止通过符号链接进行遍历等;

代码如下:

tr.SetSecurityMode(tar.MaximumSecurityMode)

又或是:

tr.SetSecurityMode(tr.GetSecurityMode() &^ tar.SanitizeFileMode)

总结

这三个安全库 SafeText、SafeOpen、SafeArchive 是非常典型的代表类别,通过这几个库我们可以从解决一些漏洞类的问题。

根据库作者的阐述,这些库在 Google 内部被广泛使用。如果大家在业务项目中,也有明确的安全要求,推荐大家学习和使用!

推荐阅读
  • Go 是 Google 的语言?核心成员的内部视角
  • 创始人 Rob Pike:Go 做对了什么,才能如此成功?
  • Go 泛型有没有可能在后期改为 <> 尖括号?

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值