用Joern執行CPGQL找到C語言中不安全函數調用的流程

1. 引入

靜態應用程序安全測試(Static application security testing)簡稱SAST,是透過審查程式源代碼來識別漏洞,提升軟件安全性的作法。
Joern 是一個強大的開源靜態應用安全測試(SAST)工具,專注于代碼的語義分析。它通過將源代碼轉換為代碼屬性圖(Code Property Graph, CPG),并使用專用查詢語言 CPGQL 進行漏洞檢測。
CPGQL(Code Property Graph Query Language)是 Joern 平臺用于查詢代碼屬性圖(Code Property Graph, CPG)的專用查詢語言。CPG 是一種將源代碼的多種屬性(如語法結構、控制流、數據流等)整合為統一圖結構的表示方法,而 CPGQL 則提供了靈活強大的圖查詢能力。CPGQL 基于圖論,支持節點(Node)、邊(Edge)和路徑(Path)的查詢。
本文參考1中的查詢語句,復現部分CPGQL,目的是為了熟悉Joern的使用,更好的理解CPGQL。

2. 整體過程

如下C代碼與CPGQL均來自Joern官網(參考1)。

  1. 安裝Joern,參考2,本文在ubuntu22.04下進行
wget https://github.com/joernio/joern/releases/latest/download/joern-install.sh
chmod +x ./joern-install.sh
sudo ./joern-install.sh

注意,如果網速慢,需要打開joern-install.sh,對其中curl命令加proxy(curl -x "http:xxxxyyyzzzeeeddd")。

  1. 將如下有有缺陷的c語言代碼保存為 insecure_gets.c
int insecure_gets() {char str[DST_BUFFER_SIZE];gets(str);printf("%s", str);return 0;
}

這段代碼使用了 C 標準庫中的gets()函數,這是一個嚴重的安全隱患,可能導致緩沖區溢出攻擊。

  1. 使用Joern將C代碼轉換為代碼屬性圖CPG
/opt/joern/joern-cli/joern-parse insecure_gets.c --output insecure_gets.cpg.bin
  1. 使用Joern加載CPG
joern /data/yinbin/projects/ybresearch/joernlearn/insecure_gets.cpg.bin
  1. 在Joern的Shell中加載該CPG
joern> open("insecure_gets.cpg.bin")
val res2: Option[io.joern.console.workspacehandling.Project] = Some(value = Project(projectFile = ProjectFile(inputPath = "/data/yinbin/projects/ybresearch/joernlearn/insecure_gets.cpg.bin",name = "insecure_gets.cpg.bin"),path = /data/yinbin/projects/ybresearch/joernlearn/workspace/insecure_gets.cpg.bin,cpg = Some(value = Cpg[Graph[72 nodes]]))
)

使用open命令即可加載。

  1. 執行CPGQL

這里執行的CPGQL為({cpg.method("(?i)gets").callIn}).l,含義如下:

  • cpg:代表整個代碼屬性圖(Code Property Graph)的根節點。
  • method("(?i)gets"):查找名稱匹配正則表達式"(?i)gets"的方法:
    • (?i):正則修飾符,表示忽略大小寫(匹配getsGETSGets等)。
    • gets:目標函數名。
  • callIn:獲取調用這些方法的所有調用點(即查找哪些代碼調用了gets())。
  • .l:將查詢結果轉換為列表并返回。

這個查詢等價于:

“找出代碼庫中所有調用了gets()函數的位置,無論大小寫。”

具體運行過程如下:

joern> ({cpg.method("(?i)gets").callIn}).l|
val res3: List[io.shiftleft.codepropertygraph.generated.nodes.Call] = List(Call(argumentIndex = -1,argumentName = None,code = "gets(str)",columnNumber = Some(value = 3),dispatchType = "STATIC_DISPATCH",dynamicTypeHintFullName = IndexedSeq(),lineNumber = Some(value = 3),methodFullName = "gets",name = "gets",offset = None,offsetEnd = None,order = 3,possibleTypes = IndexedSeq(),signature = "",typeFullName = "ANY")
)

這個結果說明:

  • code = “gets(str)”
    • 調用gets()的代碼行,參數為str(對應之前代碼示例中的char str[DST_BUFFER_SIZE])。
  • lineNumber = Some(value = 3)
    • 調用發生在第 3 行(與之前的代碼示例一致)。
  • columnNumber = Some(value = 3)
    • 調用從第 3 列開始(縮進后的位置)。
  • methodFullName = “gets”
    • 被調用方法的全名是gets。
  • dispatchType = “STATIC_DISPATCH”
    • 靜態調用(編譯時確定調用目標)。

3. 總結

本文給出了從安裝Joern到用Joern執行CPGQL找到C語言中不安全函數調用的流程的完整示例。

4. 參考

  1. joern官方查詢語句說明,https://queries.joern.io/
  2. 深入淺出Joern(一)Joern與CPG是什么,https://lorexxar.cn/2023/08/21/joern-and-cpg/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88796.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88796.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88796.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

讀文章 Critiques of World model

論文名稱:對世界模型的批判 作者單位: CMU, UC SD 原文鏈接:https://arxiv.org/pdf/2507.05169 摘要: 世界模型(World Model)——即真實世界環境的算法替代物,是生物體所體驗并與之…

利用docker部署前后端分離項目

后端部署數據庫:redis部署:拉取鏡像:doker pull redis運行容器:docker run -d -p 6379:6379 --name my_redis redismysql部署:拉取鏡像:docker pull mysql運行容器:我這里3306被占了就用的39001映射docker run -d -p 39001:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /hom…

YOLOv11調參指南

YOLOv11調參 1. YOLOv11參數體系概述 YOLOv11作為目標檢測領域的前沿算法,其參數體系可分為四大核心模塊: 模型結構參數:決定網絡深度、寬度、特征融合方式訓練參數:控制學習率、優化器、數據增強策略檢測參數:影響預測…

云原生核心技術解析:Docker vs Kubernetes vs Docker Compose

云原生核心技術解析:Docker vs Kubernetes vs Docker Compose 🚢???? 一、云原生核心概念 ?? 云原生(Cloud Native) 是一種基于云計算模型構建和運行應用的方法論,核心目標是通過以下技術實現彈性、可擴展、高可…

keepalive模擬操作部署

目錄 keepalived雙機熱備 一、配置準備 二、配置雙機熱備(基于nginx) web1端 修改配置文件 配置腳本文件 web2端 修改配置文件 配置腳本文件 模擬檢測 開啟keepalived服務 訪問結果 故障模擬 中止nginx 查看IP 訪問瀏覽器 重啟服務后…

Java 中的 volatile 是什么?

&#x1f449; volatile &#xff1a;不穩定的 英[?v?l?ta?l] 美[?vɑ?l?tl] adj. 不穩定的;<計>易失的;易揮發的&#xff0c;易發散的;爆發性的&#xff0c;爆炸性的;易變的&#xff0c;無定性的&#xff0c;無常性的;短暫的&#xff0c;片刻的;活潑的&#xff…

MongoDB性能優化實戰指南:原理、實踐與案例

MongoDB性能優化實戰指南&#xff1a;原理、實踐與案例 在大規模數據存儲與查詢場景下&#xff0c;MongoDB憑借其靈活的文檔模型和水平擴展能力&#xff0c;成為眾多互聯網及企業級應用的首選。然而&#xff0c;在生產環境中&#xff0c;隨著數據量和并發的增長&#xff0c;如何…

細談kotlin中綴表達式

Kotlin 是一種適應你編程風格的語言&#xff0c;允許你在想什么時候寫代碼就什么時候寫代碼。Kotlin 提供了一些機制&#xff0c;幫助我們編寫易讀易懂的代碼。其中一個非常有趣的機制是 中綴表達式&#xff08;infix notation&#xff09;。它允許我們定義和調用函數時省略點號…

[Nagios Core] CGI接口 | 狀態數據管理.dat | 性能優化

鏈接&#xff1a;https://assets.nagios.com/downloads/nagioscore/docs/nagioscore/4/en/ docs&#xff1a;Nagios Core Nagios Core 是功能強大的基礎設施監控系統&#xff0c;包含 CGI 程序&#xff0c;允許用戶通過 Web 界面查看當前狀態、歷史記錄等。通過以下技術棧實現…

Linux進程優先級機制深度解析:從Nice值到實時調度

前言 在Linux系統中&#xff0c;進程優先級決定了CPU資源的分配順序&#xff0c;直接影響系統性能和關鍵任務的響應速度。無論是優化服務器負載、確保實時任務穩定運行&#xff0c;還是避免低優先級進程拖慢系統&#xff0c;合理調整進程優先級都是系統管理和性能調優的重要技能…

深入淺出Kafka Broker源碼解析(下篇):副本機制與控制器

一、副本機制深度解析 1.1 ISR機制實現 1.1.1 ISR管理核心邏輯 ISR&#xff08;In-Sync Replicas&#xff09;是Kafka保證數據一致性的核心機制&#xff0c;其實現主要分布在ReplicaManager和Partition類中&#xff1a; public class ReplicaManager {// ISR變更集合&#xff0…

Fluent許可文件安裝和配置

在使用Fluent軟件進行流體動力學模擬之前&#xff0c;正確安裝和配置Fluent許可文件是至關重要的一步。本文將為您提供詳細的Fluent許可文件安裝和配置指南&#xff0c;幫助您輕松完成許可文件的安裝和配置&#xff0c;確保Fluent軟件能夠順利運行。 一、Fluent許可文件安裝步驟…

Python----大模型( RAG的文本分割,文本分割方法 )

一、RAG文本分割RAG&#xff08;Retrieval-Augmented Generation&#xff0c;檢索增強生成&#xff09;模型是一種結合了檢索 和生成能力的自然語言處理模型。 它通過檢索相關的文檔片段&#xff0c;并將這些信息作為生成過程的上下文&#xff0c;以提高生成質量 和準確性。在R…

vue筆記3 VueRouter VueX詳細講解

vueRouter & vueX 看到這里的朋友如果沒有看過前幾期&#xff0c;可以通過文章的鏈接跳轉到第一期&#xff0c;從第一期的 vue2 語法開始學習&#xff0c;如果是復習的朋友&#xff0c;也可以看本期只學習 vueRouter & VueX 項目初始化 經過上期&#xff0c;我們學習…

從當下需求聊聊Apifox 與 Apipost 的差異

作為一名長期投身于復雜項目開發的工程師&#xff0c;我深切體會到一款適配的接口管理工具對提升開發效率的關鍵意義。當團隊在進行工具選型時&#xff0c;我對 Apifox 和 Apipost 展開了全面且系統的對比分析&#xff0c;其中的諸多發現&#xff0c;值得與大家深入探討。 一、…

藍牙協議棧高危漏洞曝光,攻擊可入侵奔馳、大眾和斯柯達車載娛樂系統

OpenSynergy BlueSDK關鍵漏洞&#xff0c;可遠程執行代碼入侵數百萬車輛系統PCA網絡安全公司的研究人員在OpenSynergy BlueSDK藍牙協議棧中發現了一組被統稱為"完美藍"&#xff08;PerfektBlue&#xff09;的關鍵漏洞。利用這些漏洞可能對數百萬輛汽車實施遠程代碼執…

Android 性能優化:啟動優化全解析

前言 Android應用的啟動性能是用戶體驗的重要組成部分。一個啟動緩慢的應用不僅會讓用戶感到煩躁&#xff0c;還可能導致用戶放棄使用。 本文將深入探討Android應用啟動優化的各個方面&#xff0c;包括啟動流程分析、優化方法、高級技巧和具體實現。 一、Android應用啟動流程深…

前沿重器[69] | 源碼拆解:deepSearcher動態子查詢+循環搜索優化RAG流程

前沿重器欄目主要給大家分享各種大廠、頂會的論文和分享&#xff0c;從中抽取關鍵精華的部分和大家分享&#xff0c;和大家一起把握前沿技術。具體介紹&#xff1a;倉頡專項&#xff1a;飛機大炮我都會&#xff0c;利器心法我還有。&#xff08;算起來&#xff0c;專項啟動已經…

Vue+axios

1. axios簡介axios 是一個基于 Promise 的 HTTP 客戶端&#xff0c;主要用于瀏覽器和 Node.js 環境中發送 HTTP 請求。它是目前前端開發中最流行的網絡請求庫之一&#xff0c;被廣泛應用于各種 JavaScript 項目&#xff08;如 React、Vue、Angular 等框架或原生 JS 項目&#x…

通過Tcl腳本命令:set_param labtools.auto_update_hardware 0

1.通過Tcl腳本命令&#xff1a;set_param labtools.auto_update_hardware 0 禁用JTAG上電檢測&#xff0c;因為2016.1 及更高版本 Vivado 硬件管理器中&#xff0c;當 FPGA正連接編程電纜時 重新上電&#xff0c;可能會出現FPGA無法自動加載程序的故障。 2.還可以通過 hw_serv…