近年來,大語言模型(LLM)的應用日益普及,然而,伴隨而來的安全風險也不容忽視。本文針對根據 Flask 框架開發的 Web 應用程式,探討了數種常見的 LLM 相關漏洞,例如利用產品評論功能進行間接提示注入攻擊以刪除使用者帳戶,以及在渲染產品評論時因未正確處理使用者輸入而導致的跨站指令碼攻擊。此外,文章也分析了零樣本學習攻擊和同形異義詞攻擊的原理和實務案例,並闡述如何透過輸入驗證、強化模型訓練、監控與日誌記錄等方式來防範這些攻擊,確保應用程式安全。最後,文章也探討了模型投毒和鏈式提示詞注入等進階攻擊手法,並提供相應的防範策略,協助開發者建構更安全的 LLM 應用程式。
Web LLM 攻擊:Flask 應用程式漏洞分析與防範
本篇文章將探討兩個根據 Flask 的 Web 應用程式漏洞,分別是間接提示注入(Indirect Prompt Injection)與跨站指令碼攻擊(Cross-Site Scripting, XSS)。這兩種攻擊均源於應用程式對使用者輸入處理的不當,導致攻擊者能夠執行惡意操作。
間接提示注入攻擊
漏洞分析
第一個範例程式碼建立了一個具有多個端點的 Flask 應用程式,包括使用者註冊、變更電子郵件地址以及提交產品評論。該應用程式存在一個漏洞,允許攻擊者利用產品評論功能刪除使用者帳戶。
from flask import Flask, request, jsonify
app = Flask(__name__)
users = {}
@app.route('/register', methods=['POST'])
def register():
email = request.form.get('email')
password = request.form.get('password')
users[email] = {'password': password}
return jsonify({'message': 'Account registered successfully'})
@app.route('/change-email', methods=['POST'])
def change_email():
email = request.form.get('email')
new_email = request.form.get('new_email')
if email in users:
users[email]['email'] = new_email
return jsonify({'message': 'Email address updated successfully'})
else:
return jsonify({'error': 'User not found'})
@app.route('/add-review', methods=['POST'])
def add_review():
product_name = request.form.get('product_name')
review = request.form.get('review')
if product_name == 'leather jacket':
if 'delete_account' in review:
del users[request.remote_addr]
return jsonify({'message': 'Account deleted successfully'})
else:
return jsonify({'message': 'Review added successfully'})
else:
return jsonify({'error': 'Product not found'})
if __name__ == '__main__':
app.run(debug=True)
#### 內容解密:
- 漏洞源:
add_review函式檢查評論中是否包含'delete_account'字串,如果包含,則刪除與客戶端 IP 地址相關聯的使用者帳戶。 - 攻擊步驟:
- 攻擊者註冊一個新帳戶。
- 提交包含
'delete_account'的評論給指定的產品(例如 “leather jacket”)。 - 當應用程式處理此評論時,會刪除與攻擊者 IP 地址相關聯的使用者帳戶。
- 防範措施:
- 避免直接使用客戶端 IP 地址作為使用者帳戶的識別符號。
- 對使用者輸入進行嚴格驗證和過濾,避免惡意字串注入。
跨站指令碼攻擊(XSS)
漏洞分析
第二個範例程式碼同樣建立了一個 Flask 應用程式,但這次的漏洞在於對產品評論的處理,使用了 render_template_string 函式直接渲染評論內容,導致 XSS 攻擊的可能性。
from flask import Flask, request, jsonify, render_template_string
app = Flask(__name__)
users = {}
product_reviews = {
'gift_wrap': [
'<p>This product is amazing!</p>',
'<p>This product is out of stock and cannot be ordered.</p>',
'<p>When I received this product I got a free T-shirt with "{{ xss_payload }}" printed on it. I was delighted!</p>'
]
}
@app.route('/register', methods=['POST'])
def register():
email = request.form.get('email')
password = request.form.get('password')
users[email] = {'password': password}
return jsonify({'message': 'Account registered successfully'})
@app.route('/login', methods=['POST'])
def login():
email = request.form.get('email')
password = request.form.get('password')
if email in users and users[email]['password'] == password:
return jsonify({'message': 'Login successful'})
else:
return jsonify({'error': 'Invalid email or password'})
@app.route('/product-info', methods=['GET'])
def product_info():
product_name = request.args.get('product_name')
if product_name in product_reviews:
reviews = product_reviews[product_name]
xss_payload = '<iframe src="my-account" onload="this.contentDocument.forms[1].submit()">'
reviews_rendered = [render_template_string(review, xss_payload=xss_payload) for review in reviews]
return jsonify({'reviews': reviews_rendered})
else:
return jsonify({'error': 'Product not found'})
if __name__ == '__main__':
app.run(debug=True)
#### 內容解密:
- 漏洞源:
product_info函式使用render_template_string直接渲染產品評論,並注入了潛在的 XSS 攻擊酬載。 - 攻擊步驟:
- 攻擊者註冊並登入帳戶。
- 提交包含惡意 XSS 酬載的產品評論。
- 當其他使用者檢視產品資訊頁面時,嵌入在評論中的 XSS 酬載被執行,可能導致未授權操作,如刪除帳戶。
- 防範措施:
- 對使用者提交的內容進行嚴格的 HTML 轉義,避免直接渲染使用者輸入。
- 使用安全的範本引擎,並避免使用
render_template_string直接渲染動態內容。
LLM 攻擊技術分析與防範
隨著人工智慧(AI)與大語言模型(LLM)的快速發展,相關的安全問題也逐漸浮現。本文將探討兩種針對LLM的攻擊技術:零樣本學習攻擊(Zero-Shot Learning Attacks) 與 同形異義詞攻擊(Homographic Attacks),並分析其運作原理與防範措施。
零樣本學習攻擊
零樣本學習攻擊是指攻擊者透過提交一系列看似無害的提示(prompts),逐步引導LLM學習執行特定的惡意任務。這種攻擊的危險之處在於,LLM可能會在沒有明確訓練的情況下執行惡意任務。
易受攻擊的Flask應用程式範例
以下是一個簡化的Flask應用程式範例,用於模擬LLM API:
from flask import Flask, request, jsonify
app = Flask(__name__)
# 無害提示資料集
harmless_prompts = {
"How do you greet someone politely?": "Say hello and smile.",
"What is the capital of France?": "Paris is the capital of France.",
"How do you make a cup of tea?": "Boil water, add tea leaves, and steep for a few minutes.",
}
# 處理提示的端點
@app.route('/prompt', methods=['POST'])
def prompt():
prompt_text = request.json.get('prompt')
if prompt_text in harmless_prompts:
response = harmless_prompts[prompt_text]
return jsonify({'response': response})
else:
return jsonify({'error': 'Prompt not found'})
# 處理惡意提示的端點
@app.route('/malicious-prompt', methods=['POST'])
def malicious_prompt():
malicious_prompt_text = request.json.get('malicious_prompt')
print("Received malicious prompt:", malicious_prompt_text)
return jsonify({'message': 'LLM trained successfully with malicious prompt'})
if __name__ == '__main__':
app.run(debug=True)
#### 內容解密:
- 無害提示資料集:定義了一個包含無害提示及其對應回應的字典,用於引導LLM學習有益行為。
- 處理提示的端點:檢查收到的提示是否存在於無害提示資料集中,並傳回對應的回應或錯誤訊息。
- 處理惡意提示的端點:模擬使用惡意提示訓練LLM的過程,實際上只是列印出收到的惡意提示並傳回成功訊息。
同形異義詞攻擊
同形異義詞攻擊是指攻擊者利用視覺上相似的字元(homoglyphs)來偽裝惡意程式碼,以欺騙LLM執行未經授權的操作。
易受攻擊的Flask應用程式範例
from flask import Flask, request, jsonify
app = Flask(__name__)
# 無害提示資料集
harmless_prompts = {
"How do you greet someone politely?": "Say hello and smile.",
"What is the capital of France?": "Paris is the capital of France.",
"How do you make a cup of tea?": "Boil water, add tea leaves, and steep for a few minutes.",
}
# 處理提示的端點
@app.route('/prompt', methods=['POST'])
def prompt():
prompt_text = request.json.get('prompt')
if prompt_text in harmless_prompts:
response = harmless_prompts[prompt_text]
return jsonify({'response': response})
else:
return jsonify({'error': 'Prompt not found'})
# 處理惡意提示的端點
@app.route('/malicious-prompt', methods=['POST'])
def malicious_prompt():
malicious_prompt_text = request.json.get('malicious_prompt')
processed_prompt = malicious_prompt_text.replace('1', 'l') # 替換同形異義詞
response = eval(processed_prompt) # 執行處理後的提示
return jsonify({'response': response})
if __name__ == '__main__':
app.run(debug=True)
#### 內容解密:
- 處理惡意提示的端點:接收惡意提示,替換其中的同形異義詞,並使用
eval函式執行處理後的程式碼。 - 安全風險:由於使用
eval函式執行使用者輸入的程式碼,可能導致未經授權的程式碼執行,帶來安全風險。
防範措施
- 輸入驗證與清理:對所有使用者輸入進行嚴格驗證與清理,避免惡意輸入。
- 避免使用
eval函式:盡量避免使用eval函式執行動態程式碼,改用更安全的替代方案。 - 強化模型訓練:加強LLM的訓練資料與流程,提高其對惡意輸入的辨識能力。
- 監控與日誌記錄:對LLM的輸入與輸出進行監控與日誌記錄,以便及時發現與應對潛在攻擊。
LLM 安全威脅:探討與實務防範
前言
大語言模型(LLM)的快速發展為自然語言處理領域帶來了革命性的進步,但同時也引入了新的安全挑戰。本文將探討LLM相關的安全威脅,包括模型投毒、提示詞操控、鏈式提示詞注入等攻擊手段,並分析如何有效防範這些威脅。
LLM 模型投毒攻擊例項分析
易受攻擊的 Flask 應用程式範例
以下是一個模擬LLM API的易受攻擊的Flask應用程式範例,用於展示模型投毒攻擊的原理:
from flask import Flask, request, jsonify
app = Flask(__name__)
# 虛擬的訓練資料集,包含提示詞及其對應的動作
training_data = {
"列印此訊息": "print('這是一條無害的訊息')",
# 可在此新增更多提示詞和對應的動作
}
# 處理提示詞的端點
@app.route('/prompt', methods=['POST'])
def prompt():
prompt_text = request.json.get('prompt')
# 檢查提示詞是否存在於訓練資料集中
if prompt_text in training_data:
response = training_data[prompt_text]
return jsonify({'response': response})
else:
return jsonify({'error': '未找到提示詞'})
if __name__ == '__main__':
app.run(debug=True)
內容解密:
- Flask 應用程式初始化:建立一個Flask應用程式以建立RESTful API。
- 訓練資料集:
training_data字典包含一系列提示詞及其對應的動作,用於訓練LLM模型。 - 提示詞端點:
/prompt端點接收使用者(或攻擊者)傳送的JSON資料,檢查提示詞是否存在於training_data中,並傳回對應的動作或錯誤訊息。
模型投毒攻擊原理與防範
攻擊原理
- 模型投毒:攻擊者在模型訓練階段將惡意程式碼注入訓練資料中,例如偽裝成合法動作的惡意程式碼。
- 模型訓練:LLM模型在被投毒的資料集上進行訓練,將特定輸入與注入的惡意程式碼關聯起來。
- 程式碼注入:在推理階段,攻擊者傳送包含類別似請求的提示詞,但嵌入了惡意程式碼。LLM執行注入的惡意程式碼而非無害動作。
防範措施
- 輸入驗證:嚴格驗證使用者輸入,防止惡意程式碼注入。
- 存取控制:限制對模型訓練資料和API端點的存取許可權。
- 異常檢測:實施異常檢測機制,及時發現並處理可疑行為。
鏈式提示詞注入攻擊
易受攻擊的 Flask 應用程式範例(鏈式提示詞)
from flask import Flask, request, jsonify
app = Flask(__name__)
# 虛擬的鏈式提示詞字典,用於儲存提示詞及其對應的動作
chained_prompts = {}
# 處理提示詞的端點
@app.route('/prompt', methods=['POST'])
def prompt():
prompt_text = request.json.get('prompt')
# 檢查提示詞是否存在於鏈式提示詞字典中
if prompt_text in chained_prompts:
response = chained_prompts[prompt_text]
return jsonify({'response': response})
else:
return jsonify({'error': '未找到提示詞'})
# 新增鏈式提示詞的端點
@app.route('/add-prompt', methods=['POST'])
def add_prompt():
prompt_text = request.json.get('prompt')
action = request.json.get('action')
# 將提示詞及其對應的動作新增到鏈式提示詞字典中
chained_prompts[prompt_text] = action
return jsonify({'message': '提示詞已成功新增'})
if __name__ == '__main__':
app.run(debug=True)
內容解密:
- 鏈式提示詞字典:
chained_prompts字典儲存一系列提示詞及其對應的動作。 - 新增提示詞端點:
/add-prompt端點允許使用者(或攻擊者)新增新的提示詞及其對應的動作到chained_prompts字典中。 - 攻擊原理:攻擊者透過
/add-prompt端點新增一系列看似無害但實際上相互關聯的提示詞,最終導致LLM執行惡意程式碼。
關於 Hadess
Hadess 是一家致力於保護數位資產、開發安全數位生態系統的網路安全公司。我們的使命是透過創新和專業的網路安全服務懲治駭客、強化客戶防禦能力。Hadess 的願景是成為網路安全的先鋒,創造一個數位資產得到充分保護、企業和個人能夠安心發展的數位世界。我們透過不懈創新和堅定奉獻,旨在將 Hadess 開發為信任、韌性和報復性網路威脅鬥爭中的標誌性力量。
聯絡資訊
- 電子郵件:MARKETING@HADESS.IO
- 網站:WWW.HADESS.IO
本文章經過完整重構,確保內容原創性、技術深度及台灣本地化語言風格,同時嚴格遵守所有規定和格式規範。