由于大的Solarwinds Hack和最近描述了新依赖混乱攻击的博客文章,最近有很多关于供应链攻击的谈话,令人妥协的安全元素损害的偷偷摸摸的技术来危及更安全的目标。
一种流行的供应链攻击目标始终是流行的编程语言的许多包管理系统,例如JavaScript,Rubys的RubyGem和Python的Pypi。这些系统多年来困扰着恶意演员上传恶意包裹并等待受害者安装它们。
我没有听说过很多谈论情况如何寻找去生态系统,因为Go是我的新语言,我决定做一些调查。
新颖的依赖混淆攻击矢量幸运的是,由于进口包在导入包时始终明确指定源,因此在获取外部依赖项时,源自依赖,因此无法困惑,因此无法对此进行烦恼,因此在哪里获取它:
然而,通过简单的Typosquatting,攻击者在键盘上打字时,攻击者攻击的事实仍然是一个可能的攻击矢量。这两者都可以在主机域上完成,其中攻击者注册Github.com的常见错误,但更容易将在GitHub上注册新用户或任何其他打开的包主机,其中包含包所有者的常见拼写错误用户名。
考虑到这一点,我旨在建造一个可以帮助我在野外揭开潜在类型的工具:
使每个唯一包所有者的用户名置换为获取潜在类型的列表
记录具有等于正在检查的原始软件包的名称的任何存储库
这导致了一个新的工具,我称之为Gitlab上可用的PKGTWIST(如果您有兴趣做自己的邪恶去包狩猎,则该名称由Awesome DNSTWIST工具启发)。
可能是Pkgtwist最重要的部分是良好的用户名排列,以获得最佳检测类型的机会。一些研究导致了我到Zntrio / typogenerater,它看起来像是用于生成潜在用户名字的完美包装。包装实现了一个很长的置换策略列表,即我从中挑选了一些人,以便PKGTWIST只花时间检查我的觉得最有可能的类型:
这意味着如果pkgtwist给予包github.com/strettr/timedify作为输入,它将检查github上是否存在任何以下用户,如果他们这样做,请检查它们是否也有一个名为testify的存储库:
tretchr sretchr stetchr strtchr strechr strethr stretcr拉伸sstretchr sttretchr strretchr streetchr strettchr stretcchr stretchhr stretchrr rtretchr qtretchr ptretchr wtretchr vtretchr utretchr ttretchr suretchr svretchr swretchr spretchr sqretchr srretchr ssretchr stsetchr stpetchr stqetchr stvetchr stwetchr sttetchr stuetchr strdtchr strgtchr strftchr stratchr strctchr strbtchr streuchr strevchr strewchr strepchr streqchr strerchr streschr StretBHR Stretahr Stretghr StretFHR STRITEHR Stretdhr Stretcir Stretcjr Stretckr Stretclr Stretcmr Stretcnr Stretcor Stracts Stretchp Strettings Stratchv restretw Stratchrituts Tsretchr srtetchr Stertchr Strttechr Stretchr Stretcrh Stretchr Stretcrh
接下来是找到要检查的包列表。最初,我想到了寻找某种“顶级X Go Packages”列表,但我真的无法找到一个很好的资源,所以我最终从Gathub.com和Gitlab.com托管包中运行了pkgtwist模块索引(全部731包)。
经过几个小时的时间通过731封装,PKGTWIST完成了7个潜在的Typosquat包装清单,以进一步调查。老实说,预计列表要更大,但我当然很高兴看到Go生态系统并没有完全被侵染(尚未使用恶意的Typosquat包裹。
Sirupsen的Logrus包是一个非常受欢迎的日志记录包(GitHub上的17.3k星级),许多Go Projects使用,这显然使其成为Typosquat供应链攻击的目标。因此,当我看到用户SiRuspen(注意字母交换)有类似命名的存储库时,我很快就会检查它正在做的事情。
事实证明,该项目是原始Logrus存储库的叉子,因此比较要找到差异非常容易。在撰写本文时,唯一添加到潜在的typosquat存储库,是一个小型init函数,单个println呼叫:
虽然这不是恶意以任何方式,但是在未来的所有者可以非常迅速地改变,所以我肯定会在这个存储库中留意。如果您使用Logrus以确保您不使用此包而不是真实的,我还建议推荐仔细检查项目。
URFAVE / CLI是建立CLI项目的另一个受欢迎的GO包(GITHUB上的15.4k星星)。因此,当我看到用户UTFAVE也有一个名为CLI的存储库,我的闹钟铃声脱离了,我进一步调查了。
它看起来是Utfave希望使用他们的URFave / CLI版本了解所有计算机的主机名,操作系统和体系结构。该函数提取系统信息,然后通过HTTP向中国公司腾讯计算机系统呼出到中国公司深圳腾讯计算机系统的IP地址122.51.124.140,并将系统信息添加为URL参数。
虽然此代码不会给出任何对系统的访问权限,但它非常可疑,它们收集此信息,并且演员可以快速更改此代码,如果它们识别系统是有价值或有趣的,则可以快速更改此代码以调用反向外壳。
我向Github报道了这个存储库,希望看到它在不久的将来下降。在此之前,我建议使用URFAVE / CLI来仔细检查项目,以确保您不使用typosquatted版本。
虽然我的小型研究项目没有在那里覆盖每一个Go封装,但我觉得它足以给出到Go生态系统的供应链攻击情况的粗略图片。这两个存储库苏黎普鲁斯/洛格勒斯和utfave / cli是唯一一个从7标记的repos中唯一一个真正担心我的那些,但我会在其余的休息时保持紧密的眼睛,因为他们在任何时候都可以变得恶意。
我认为Go是比其他编程语言更好的情况,因为每次使用时都是始终明确写入的包,但代码编辑器自动化可以使类型更可能发生的类型,因为开发人员无法手动编写导入路径。经常。例如,如果安装了VS代码的流行Go扩展,则开发人员通常只在第一个使用情况下键入包导入,然后在使用包名称时,编辑器将自动在任何其他文件中添加导入。如果开发人员在进口路径第一次出现进口路径时,可以在它发现之前在GO项目中引入恶意包并长时间地生活。