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
57
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
開發安全分享簡報
Kika 本人的第一份分享簡報
歡迎查閱XD
原創內容,若要使用請說明出處感謝 o.o
Kika
February 02, 2025
Other Decks in Technology
See All in Technology
kaonavi Tech Night#1
kaonavi
0
180
A Bag-of-Documents Model for Query Specificity
dtunkelang
0
100
GoでCコンパイラを作った話
repunit
0
160
設計レビューとAIハーネスで向き合う AIが生み出した新しいボトルネックの対処法 / Design Reviews and AI Harnesses Against New Bottlenecks Created by AI
nstock
5
500
Jitera Company Deck
jitera
0
570
Webの技術とガジェットで子どもも大人も楽しめるワクワク体験を提供する / Qiita Tech Festa Day 2026
you
PRO
1
290
論語・武士道・産業革命から見る かわるもの、かわらないもの
ichimichi
7
1.1k
AI工学特論: MLOps・継続的評価
asei
10
2.7k
Git 研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
430
現場との対話から始める “作る前に問い直す”業務改善
mochico50
2
310
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
6
1.5k
Multicaで30個のミニプロジェクトをAIエージェント運用して見えてきたこと
eiei114
1
660
Featured
See All Featured
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Embracing the Ebb and Flow
colly
88
5.1k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.7k
Become a Pro
speakerdeck
PRO
31
6k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
Six Lessons from altMBA
skipperchong
29
4.4k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Marketing to machines
jonoalderson
1
5.6k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
How to Talk to Developers About Accessibility
jct
2
440
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…