Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
開發安全分享簡報
Search
Kika
February 02, 2025
Technology
0
25
開發安全分享簡報
Kika 本人的第一份分享簡報
歡迎查閱XD
原創內容,若要使用請說明出處感謝 o.o
Kika
February 02, 2025
Tweet
Share
Other Decks in Technology
See All in Technology
公開初日に個人環境で試した Gemini CLI 体験記など / Gemini CLI実験レポート
you
PRO
3
1.3k
2025-07-31: GitHub Copilot Agent mode at Vibe Coding Cafe (15min)
chomado
2
290
【CEDEC2025】大規模言語モデルを活用したゲーム内会話パートのスクリプト作成支援への取り組み
cygames
PRO
1
550
P2P ではじめる WebRTC のつまづきどころ
tnoho
1
280
From Live Coding to Vibe Coding with Firebase Studio
firebasethailand
1
340
オブザーバビリティプラットフォーム開発におけるオブザーバビリティとの向き合い / Hatena Engineer Seminar #34 オブザーバビリティの実現と運用編
arthur1
0
220
20250728 MCP, A2A and Multi-Agents in the future
yoshidashingo
1
160
データエンジニアがクラシルでやりたいことの現在地
gappy50
3
790
「AI駆動開発」のボトルネック『言語化』を効率化するには
taniiicom
1
230
ファインディにおける Dataform ブランチ戦略
hiracky16
0
240
Bet "Bet AI" - Accelerating Our AI Journey #BetAIDay
layerx
PRO
2
570
LLMをツールからプラットフォームへ〜Ai Workforceの戦略〜 #BetAIDay
layerx
PRO
1
290
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
530
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
283
13k
Unsuck your backbone
ammeep
671
58k
Reflections from 52 weeks, 52 projects
jeffersonlam
351
21k
Making Projects Easy
brettharned
117
6.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Music & Morning Musume
bryan
46
6.7k
Documentation Writing (for coders)
carmenintech
72
4.9k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
50
5.5k
How to Ace a Technical Interview
jacobian
278
23k
Transcript
開發安全 Kika
Who am I? ▪ 有參加過 IT 邦幫忙 鐵人賽 Security 組
*2 的無名小卒 ▪ DevSecOps Taiwan 社群志工 ▪ kikasecures.com 部落格作者(裝 B 部落格)
Content ▪ 為什麼選擇講這個主題? ▪ 如何建立安全開發的心態?
為什麼選擇講這個主題?
一切源自於工作經驗&信仰崩塌 我能相信你吧?
差點原諒了,果然還是得靠自己
如何建立安全開發心態?
假設我們要開發一款武器…
渣男 / 渣女式的全方位清理 ▪ 了解做成捉姦武器的原料會不會被動手腳 ▪ 不要相信渣男/渣女說出來的話 – 左耳進、右耳出,自動過濾 ▪
處理有可能讓我們捉姦失敗的 case,好好紀錄一切的錯誤 ▪ 反覆測試捉姦武器 ▪ 甜言蜜語防護罩 ▪ 不要被發現我們要展開報復行動 – 演練被發現的方式 ▪ 不要被抓到把柄,讓他們 PUA 你
了解做成捉姦武器的原料 會不會被動手腳 1
了解做成武器的原料會不會被動手腳 原料 程式語言 其他套件 原罪 可用的函式 JavaScript 原型鏈污染 eval Node.js
文件相關 別人做的原料 要知道怎麼做初步檢查 執行命令相關 初步篩選使用的套件
程式語言&函式
JavaScript 有什麼問題? 原型鏈污染 ▪ 何謂原型鏈? 在 JavaScript 中,所有的物件都有一個隱藏屬性 [[Prototype]](也叫 __proto__)
,這個屬性指向另一個物件,稱為「原型」。 如果你試圖存取一個物件中不存在的屬性,JavaScript 會沿著這個「原型鏈」往上 尋找,直到找到該屬性或到達 null(原型鏈的終點)。
原型鏈 Obj_1 isAdmin? Parent_ Obj isAdmin? Grandpa_ Obj isAdmin: false
isAdmin? false Obj_1. __proto__ -> Parent_Obj Obj_1. __proto__.__proto__ -> Grandpa_Obj Obj_1. __proto__.__proto__.__proto__ -> Object.prototype
JavaScript 有什麼問題? 原型鏈污染 ▪ 何謂原型鏈污染? 「原型鏈污染」是一種安全漏洞,攻擊者可以在程式中未經驗證的輸入中,將惡 意值寫入原型(通常是 Object.prototype),影響所有基於此原型的物件。 – 核心問題
JavaScript 的原型是共享的,當攻擊者改變了 Object.prototype,其他物件也 會受到影響。
原型鏈污染 Obj_1 isAdmin? Parent_ Obj isAdmin? Grandpa _ Obj isAdmin?
Obj_1. __proto__ -> Parent_Obj Obj_1. __proto__.__proto__ -> Grandpa_Obj Obj_1. __proto__.__proto__.__proto__ -> Object.prototype Object.prototype isAdmin: true isAdmin?
JavaScript 有什麼問題? 原型鏈污染 – 自建的簡單例子
JavaScript 有什麼問題? 原型鏈污染 – 第三方套件 lodash 的 merge ▪ CVE-2018-3721
JavaScript 有什麼問題? 原型鏈污染的可能危害 ▪ DoS 拒絕服務 竄改通用方法如:toString(),把字串變成整數,導致非預期行為,甚至是崩潰。 ▪ RCE 遠端代碼執行
如果程式碼包含 eval(object_a.attr),而攻擊者污染了 Object.prototype.attr,他們 可能利用這一點來執行惡意程式碼。 ▪ Property Injection 屬性注入 剛剛的 isAdmin..
JavaScript 有什麼問題? 防範原型鏈污染 ▪ Object.freeze 凍結原型 ▪ 避免使用不安全的遞迴合併函式,lodash 4.6.2 以前的版本的
merge ▪ 採用 Object.create(null) 創建無原型的物件,避免使用 Object.prototype
JavaScript 有什麼問題? 弱型別、動態型別 ▪ JS 自由度高,但是因為缺乏型別檢查,滿容易會有隱式轉換( CWE-704: Incorrect Type Conversion
or Cast)的問題。 ▪ 先備知識:弱型別、強型別、靜態型別語言、動態型別語言
▪ 強型別語言(Ex. TypeScript)要求在不同型別間進行轉換或比較時, 必須明確聲明。 ▪ 弱型別語言(Ex. JavaScript)允許在不同型別間進行隱式轉換或比 較。 強型別語言更安全,因為它要求在型別之間轉換時採取額外步驟, 要轉換型別需要明確指定。
弱型別、強型別
▪ 靜態型別語言(Ex. TypeScript)在「編譯時」進行型別檢查。 ▪ 動態型別語言(Ex. JavaScript)在執行時檢查型別。 靜態型別語言更安全,因為它能在編譯期間就發現潛在的型別錯誤, 這些錯誤在進入生產應用程式之前就被捕獲,防止其成為可被利用 的漏洞。 靜態型別、動態型別
在 JS 中,我們需要注意更多「隱式」 型別轉換的問題 ▪ 建議 仔細檢查表達式,確認運算元是否被錯誤使用,並在有錯誤的情況下修正。 如果這些隱式轉換是有意的,考慮用顯式轉換代替,以便讓程式碼的含義更清晰。
顯式轉換例子
JavaScript 的原生函式? eval 函式 ▪ eval() 是 JavaScript 中的一個內建函式,它能夠執行字串形式的 JavaScript
程式碼。 ▪ 這個鬼東西 Legacy code 很多。
Node.js 的原生函式? fs、child_process ▪ 使用任何跟檔案、路徑、命令相關的函式時,都需要注意清理或是 使用參數化。 ▪ fs: – fs.readFile()、
fs.readFileSync() 、fs.writeFile() 與 fs.writeFileSync() 等。 ▪ child_process: – exec()、execFile()、spawn() 等。
exec() -> execFile() 不會經過 Shell 解析輸入, 能有效防止指令注入 exec() execFile() 建立一個
Shell, 並在該 Shell 中執行命令
其他套件
人腦識別 – 初步篩選 - 1 可信任機構、人氣、更新頻率
人腦識別 – 初步篩選 - 2 被棄用與否
要知道怎麼做初步檢查 - Npm 的好用工具 npm audit、npm audit fix
不要相信渣男/渣女說出來的話 – 左耳進、右耳出,自動過濾 2
不要相信渣男/渣女說出來的話 左耳進、右耳出 不要往心裡去 Input 正規化、白名單 自動過濾 甜言蜜語 Input 清理 DOMPurify
Input 過濾 - DOMPurify https://cure53.de/purify
處理有可能讓我們捉姦失敗的 CASE, 好好紀錄一切的錯誤 3
處理有可能讓我們失敗的 case ,並紀錄它 處理有可能讓我 們失敗的案例 Error Handling 好好紀錄一切, 記取教訓 Log
紀錄,但要「好好」紀錄
為什麼錯誤處理很重要? ▪ 攻擊往往始於偵查階段。 ▪ 未處理的錯誤可能在此階段幫助攻擊者蒐集關鍵資料,進而為後續 攻擊提供重要基礎。
錯誤處理的注意事項 ▪ 只記錄錯誤到伺服器端的 Log 文件。 ▪ 返回通用訊息給 Client 端(Stack 錯誤
就不需要,因為太詳細了)。 ▪ 使用 4xx 和 5xx 狀態碼區分用戶端錯誤與伺服器端錯誤,並避免在 Response 中暴露實作細節。
Error Handling ▪ 記得全域的錯誤處理 – 不要忽略掉未處理的例外
Error Handling ▪ 在生產模式中,千萬不要直接回傳給前端太詳細的 stack 訊息 在測試或開發環境中使用就好!!
Log 紀錄 ▪ 不要洩漏太多(登入的密碼、敏感資訊等)
Log 紀錄 ▪ 權限問題 – 僅允許授權的用戶或服務存取 Log 文件。 – 最小權限原則。
– 定期清理與存檔 Log 文件。 – 使用安全的 Log 工具(Ex. Log4j、Winston),避免直接拼接 Log 字串。 開發人員 log Read only
反覆「測試」捉姦武器 4
反覆測試捉姦武器 ▪ Unit test (記得進行極值測試) – 可能可以檢測出潛在問題,如:溢出問題、數據溢界或處理異常輸入時的安 全缺陷。 ▪ Eslint、SonarQube
等等 – Eslint: 幫助開發人員識別和修復代碼中的潛在錯誤(如未處理的異常、未遵 循安全標準的代碼結構)。 – SonarQube: 檢測程式碼中的漏洞、錯誤以及技術債務等。
甜言蜜語防護罩 5
基本的加密 ▪ HTTPS、密碼加密(選對加密演算法)、檔案儲存加密與隔離 Blowfish
不要讓你的網站隨便可以執行別人的 JavaScript (雖然還是有可能被繞過) ▪ CSP 設定 – 可以在伺服器端 header 加上
Content-Security-Policy: default-src 'self'; – 或是在 Client 端的 HTML meta 標籤加上設定: – 如果是老舊系統過渡期可以改用 report:
不要被發現我們要展開報復行動 – 演練被發現的方式 6
簡易的判斷網站技術插件 – Wappalyzer
簡易的判斷網站技術插件 – Wappalyzer
F12 大法: 開發者工具 Network – Response Header: Server https://nginx.org/en/security_advisories.html
不要被抓到把柄,讓他們 PUA 你 7
前端程式碼可以變成外星語吧? ▪ 可以依據需求,把 JavaScript 變成看不懂的樣子 https://www.npmjs.com/package/webpack-obfuscator
可以在線上玩玩看 ▪ https://obfuscator.io/#code
一起珍惜 Git 紀錄,好嗎? ▪ 不要把什麼東西都上傳 – API Key、密碼等其他敏感資料 – .gitignore
要寫好,首次 push 以前記得檢查紀錄 ▪ 不要保有所有的 Legacy code (舊的不需要用的函式就移除) – 因為舊有的函式有可能有潛在的漏洞 or 被拿來利用
.gitignore
THE END…