trufflehog核心框架代码分析
前言:trufflehog敏感信息搜集 核心框架代码分析
参考文章:https://github.com/trufflesecurity/trufflehog
代码分析
配置初始化
主程序入口在main.go:260,这里如果是本地开发的话,可以指定localDev参数,后续方便进行调试使用
跟进到run方法中main.go:300,都是在做一些初始化,比如日志的初始化,以及缓存目录的清理,监听进程关闭,配置初始化,最终来到runSingleScan入口点函数,如下图所示
配置后续遇到可解压文件的时候,解压深度等信息
上述操作初始化完了之后来到了Start函数,参数是初始化的配置对象,如下图所示
在pkg/engine/engine.go:577的位置上面,主要进行了两个操作,分别是sanityChecks和startWorkers
消费者Worker实现
这里主要看startWorkers,这四个worker类型是用于后面处理所有的数据来进行使用的,下面给出代码注释
// Scanner workers process input data and extract chunks for detectors. // 主要的操作就是,从ChunksChan通道中获取chunk块数据,然后遍历decoder(包括base64 utf8等解码器)来进行是否可解码操作 e.startScannerWorkers(ctx) // Detector workers apply keyword matching, regexes and API calls to detect secrets in chunks. // 检测器工作人员应用关键字匹配、正则表达式和API调用来检测块中的秘密。 e.startDetectorWorkers(ctx) // verificationOverlap workers handle verification of chunks that have been detected by multiple detectors. // They ensure that verification is disabled for any secrets that have been detected by multiple detectors. //验证重叠工人处理多个检测器检测到的块的验证。 //它们确保对多个探测器检测到的任何秘密禁用验证。 e.startVerificationOverlapWorkers(ctx) // ResultsDispatcher workers communicate detected issues to the user or any downstream systems. // We want 1/4th of the notifier workers as the number of scanner workers. // 结果调度程序工作人员将检测到的问题传达给用户或任何下游系统,我们需要scanner workers的1/4的数量作为通知worker e.startNotifierWorkers(ctx)
startScannerWorkers函数
这个startScannerWorkers函数主要是根据指定的concurrency协程数量来启动scannerWorker函数
而具体的实现逻辑主要还是看scannerWorker函数中,该函数做如下几个操作
-
从ChunksChan通道中获取chunk块数据
-
遍历四种解码器decoder,分别是base64,EscapedUnicode,UTF8,UTF16来对chunk数据进行解码操作
-
解码操作结束了,对解码的数据进行预过滤关键字创建matchingDetectors对象,该对象保存了 匹配到的关键字、关键字对应的探测器、匹配到的关键字的内容
-
如果预过滤中匹配存在的话,会做下面两个操作,如下所示
- 第一种:如果匹配存在的话,并且支持一个chunk对象支持多探测器一起探测
- 第二种:如果匹配存在的话,遍历matchingDetectors,其中每个chunk都单独用一个detector探测器来进行检测
总结下startScannerWorkers的作用:主要就是将后续内容传入通过对应的解码器进行解码,然后传入到相关的verificationOverlapChunksChan和detectableChunksChan中,然后后面消费者函数来进行处理操作。
细节点:关于sync.WaitGroup的处理,这边传入verificationOverlapChunksChan和detectableChunksChan中的时候,会将当前的sync.WaitGroup的done函数作为回调带入,后续等消费者取出来之后,等消费者自己完成之后然后进行done处理,如下图所示
最后的话会进行等待sync.WaitGroup进行结束,如下图所示
这种写法的好处在于什么呢?个人认为相当于延长了scannerWorker的生命周期,不仅仅只是生产了数据就结束了,而是能够确保只有自己的数据真正的被消费者取出并完成,才能确保自己的结束
startDetectorWorkers函数
这个startDetectorWorkers函数主要是消费detectableChunksChan通道中的数据,如下图所示
startDetectorWorkers作用是循环遍历detectableChunksChan通道然后取出detectableChunk对象,创建协程放入到detectorWorker函数作为参数进行使用
跟进到detectChunk函数中,可以看到主要就是取出detectableChunksChan中的detectableChunk对象数据,通过探测器detector来进行正则规则检测是否存在敏感数据
startVerificationOverlapWorkers函数
上面的startDetectorWorkers函数主要是消费detectableChunksChan通道中的数据,而这里的startVerificationOverlapWorkers函数主要就是消费verificationOverlapChunksChan通道的数据
注意:关于detectableChunksChan和verificationOverlapChunksChan的数据的处理在于1个chunk:1个detector匹配和1个chunk:多detector匹配的区别
在verificationOverlapChunksChan的处理过程中,取出数据会先经过遍历chunk.detectors,每一个detector都会匹配一次
在这个过程中,如果某个detector中存在敏感结果的话,那么存储当前检测器的关键字和对应的检测器的映射关系到detectorKeysWithResults变量中
后续又遍历detectorKeysWithResults,将其中的chunk重新扔到detectableChunksChan队列中进行再次匹配
总结:这样做的好处是在startScannerWorkers函数中,是为了防止出现当Chunk存在多个凭证匹配,但是最终不放入verificationOverlapChunksChan处理的话,就会导致最多只有一个detector输出这个匹配结果,而实际可能其他的detector也匹配到了chunk中的其他凭证的情况。
startNotifierWorkers函数
最后的话就是startNotifierWorkers函数,这个函数实际上就是处理最终的结果
这里的e.ResultsChan()返回的结果,就是最终存储结果的一个通道对象
跟到下面的代码,实际上最终处理以某种格式来进行打印
生产者代码
将相关的消费者线程都开启了之后,接下来就是准备给消费者消费的数据。
这边首先提供了一些类型用于生产者数据的生产,如下图所示,包括了gitScan,githubScan,gitlabScan,filesystemScan等等
这边的话就用filesystemScan来进行分析数据的生成,将要扫描的路径文件以及路径目录都存储到paths切片中,接着生成sources.FilesystemConfig配置对象,将其传入到ScanFileSystem方法中
在trufflehog中每个要扫描的类型对象都是遵守实现Source接口,先初始化fileSystemSource.Init,然后再进行运行e.sourceManager.Run
跟进到run方法中会对当前的source对象获取信息,然后检查上下文的操作,最后就是调用run方法,如下图所示
run方法中重点关注的是runWithUnits,里面最终运行每个source实现的Chunks方法,在Chunks方法中会将数据都写入到ch通道中,最终将数据写入到outputChunks通道
注意:这里的outputChunks通道实际上就是前面消费者运行startScannerWorkers方法中从里面取出数据的通道对象
-
遍历路径
-
获取路径信息
-
扫描路径文件scanFile/路径目录scanDir中的数据
这边直接看scanDir方法,最终遍历完目录还是需要进行scanFile的操作
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2019-10-17 SUID提权
2019-10-17 内网中敏感文件的搜集
2019-10-17 内网探测协议出网