盤(pán):業(yè)務(wù)場(chǎng)景下的安全設(shè)計(jì)與風(fēng)控)
2017年秋招季安全圈里不少人都盯上了滴滴出行安全崗的筆試。那會(huì)兒網(wǎng)約車(chē)業(yè)務(wù)正處在高速擴(kuò)張期司乘安全、賬號(hào)安全、支付風(fēng)控全都在關(guān)鍵位置上所以這場(chǎng)筆試的題庫(kù)和市面上那種“背完OWASP TOP 10就能過(guò)”的通用安全筆試很不一樣——它更像一場(chǎng)“帶著業(yè)務(wù)場(chǎng)景做安全設(shè)計(jì)”的綜合測(cè)試。我當(dāng)年和幾個(gè)一起筆試的同學(xué)對(duì)過(guò)題大家都覺(jué)得考得偏實(shí)戰(zhàn)、偏業(yè)務(wù)很多人掛在場(chǎng)景分析題上。這篇文章把這套筆試的考點(diǎn)和題目做一次完整的復(fù)盤(pán)逐個(gè)題目講清楚考察點(diǎn)、答題思路、常見(jiàn)的失分原因給后來(lái)想沖出行領(lǐng)域安全崗的朋友做個(gè)參考。1. 筆試科目構(gòu)成2017年滴滴安全崗到底考什么1.1 整體題型分布與答題節(jié)奏先說(shuō)說(shuō)整張卷子的觀感。筆試時(shí)長(zhǎng)大概兩小時(shí)題量不算少主要包括三類(lèi)題型一類(lèi)是選擇題考察安全基礎(chǔ)知識(shí)的覆蓋面一類(lèi)是簡(jiǎn)答題要求你把某個(gè)漏洞的原理講清楚還有一類(lèi)是綜合分析題直接給一個(gè)和網(wǎng)約車(chē)相關(guān)的場(chǎng)景讓你寫(xiě)防護(hù)方案。選擇題大致覆蓋了Web安全、密碼學(xué)基礎(chǔ)、操作系統(tǒng)安全、網(wǎng)絡(luò)協(xié)議安全這些常規(guī)方向。簡(jiǎn)答題重點(diǎn)集中在Web漏洞原理與修復(fù)、Android客戶(hù)端安全、數(shù)據(jù)加密這幾個(gè)模塊。綜合分析題則基本圍繞“賬號(hào)安全”“支付安全”“反作弊防刷單”三個(gè)方向出。這里有個(gè)很重要的節(jié)奏問(wèn)題選擇題千萬(wàn)別戀戰(zhàn)。2017年那會(huì)兒不少同學(xué)剛考完一些大廠(chǎng)的筆試習(xí)慣性地在一道選擇題上糾結(jié)很久結(jié)果后面的綜合分析題來(lái)不及寫(xiě)。綜合分析題分值占比往往超過(guò)40%而且答案相對(duì)開(kāi)放只要思路清晰、方案完整基本都能拿不錯(cuò)的分。我當(dāng)時(shí)給朋友的建議是選擇題控制在30到40分鐘內(nèi)簡(jiǎn)答題控制在40分鐘內(nèi)剩下時(shí)間全部留給綜合分析題并且做綜合分析題時(shí)一定要先搭框架再寫(xiě)細(xì)節(jié)別想到哪寫(xiě)到哪。1.2 那一年出行場(chǎng)景的特殊考察傾向2017年滴滴的安全筆試有一個(gè)特點(diǎn)特別明顯安全能力必須和業(yè)務(wù)場(chǎng)景綁定。這個(gè)傾向在簡(jiǎn)答題和綜合分析題里表現(xiàn)得很突出。同樣是考“越權(quán)漏洞”有些公司就考“商品訂單越權(quán)”而滴滴考的是“查看他人行程”。“行程”這個(gè)信息在出行場(chǎng)景里的敏感性極高不只是手機(jī)號(hào)、姓名這種個(gè)人信息還包括實(shí)時(shí)軌跡、出發(fā)地、目的地、常去的家與公司地點(diǎn)。這些信息一旦泄露不僅能定位到具體的人還能分析出生活習(xí)慣所以考這道題的時(shí)候不能只答“加上權(quán)限校驗(yàn)”就完事還得考慮脫敏、風(fēng)控、告警等一整套機(jī)制。再比如“驗(yàn)證碼安全”通用考法是問(wèn)“圖形驗(yàn)證碼和短信驗(yàn)證碼有什么區(qū)別”滴滴則傾向于問(wèn)“如果司機(jī)端登錄接口被短信轟炸怎么辦”。這背后其實(shí)是對(duì)業(yè)務(wù)敏銳度的考查司機(jī)端是高頻使用場(chǎng)景不能像普通用戶(hù)端那樣做太復(fù)雜的驗(yàn)證流程否則會(huì)影響司機(jī)接單但司機(jī)賬號(hào)價(jià)值高又必須做足夠強(qiáng)的防護(hù)。合理的設(shè)計(jì)往往是在“驗(yàn)證碼校驗(yàn)”之外加入設(shè)備指紋、行為特征、頻控策略等多維風(fēng)控。1.3 一道開(kāi)場(chǎng)必答題談?wù)勀銓?duì)安全的理解這套卷子里有一個(gè)讓我印象很深的必答題問(wèn)法大概是這樣“作為一個(gè)安全從業(yè)者談?wù)勀銓?duì)出行行業(yè)安全的理解以及安全團(tuán)隊(duì)的價(jià)值在哪里。”很多人覺(jué)得這種題是送分題隨便寫(xiě)寫(xiě)就行。但按照那年的判分情況來(lái)看這題反而是拉開(kāi)差距的地方。只寫(xiě)“安全就是防護(hù)黑客攻擊”這類(lèi)空話(huà)肯定不行面題人想看的是你有沒(méi)有把安全當(dāng)成一個(gè)體系來(lái)理解。當(dāng)時(shí)我身邊一個(gè)拿到面試機(jī)會(huì)的同學(xué)他的答題思路大致是這樣的第一層是基礎(chǔ)安全包括網(wǎng)絡(luò)、主機(jī)、應(yīng)用、客戶(hù)端這些基礎(chǔ)設(shè)施的安全防護(hù)第二層是業(yè)務(wù)安全包括賬號(hào)安全、支付安全、反作弊、風(fēng)控策略第三層是數(shù)據(jù)安全與隱私保護(hù)包括敏感數(shù)據(jù)的分級(jí)分類(lèi)、脫敏、權(quán)限管控最后一層是安全運(yùn)營(yíng)包括威脅情報(bào)、監(jiān)控告警、應(yīng)急響應(yīng)。這四層構(gòu)成一個(gè)閉環(huán)并且每一層都要結(jié)合出行場(chǎng)景來(lái)落地。這個(gè)答題框架很值得借鑒。它體現(xiàn)出答題者不只是一個(gè)會(huì)打漏洞的人而是能從全局視角設(shè)計(jì)安全體系的人。而2017年滴滴安全團(tuán)隊(duì)恰恰處在快速擴(kuò)充期需要的就是這種能搭體系、能落地的綜合性安全人才。2. Web安全與業(yè)務(wù)邏輯類(lèi)真題還原2.1 SQL注入不只是“能用就注入”Web安全部分必考SQL注入這基本是當(dāng)時(shí)所有大廠(chǎng)安全崗的約定俗成。滴滴這年的考法不算偏但有個(gè)細(xì)節(jié)很值得注意它給了一段帶有過(guò)濾邏輯的代碼要求分析過(guò)濾是否能被繞過(guò)并說(shuō)明修復(fù)方案??疾禳c(diǎn)可以拆成三層第一層是SQL注入的基礎(chǔ)原理第二層是繞過(guò)過(guò)濾的思路第三層是修復(fù)方案的完整性。先說(shuō)基礎(chǔ)原理。SQL注入的本質(zhì)是程序把用戶(hù)輸入當(dāng)作SQL語(yǔ)句的一部分拼接執(zhí)行攻擊者可以通過(guò)閉合語(yǔ)句、注入子查詢(xún)等方式改變?cè)蠸QL語(yǔ)義。常見(jiàn)的注入類(lèi)型包括字符型注入和數(shù)字型注入以及基于報(bào)錯(cuò)、布爾盲注、時(shí)間盲注、聯(lián)合查詢(xún)的利用方式。代碼里的過(guò)濾如果沒(méi)有做“二次過(guò)濾”或者“黑名單覆蓋不全”通常都有繞過(guò)空間。比如過(guò)濾了空格可以用注釋符、Tab或URL編碼代替過(guò)濾了單引號(hào)可以嘗試寬字節(jié)注入這樣只要拼接時(shí)編碼不當(dāng)單引號(hào)就能逃逸出來(lái)。關(guān)鍵的固定寫(xiě)法是無(wú)論輸入是什么都必須用預(yù)編譯語(yǔ)句PreparedStatement加參數(shù)化查詢(xún)來(lái)拼接這是最底層、最穩(wěn)妥的防御。不能只做黑名單過(guò)濾因?yàn)楹诿麊斡肋h(yuǎn)跟不上攻擊手法。輸出層面還要限制異常信息回顯防止基于報(bào)錯(cuò)的注入被利用。這題想拿高分就一定要答出“縱深防御”預(yù)編譯是核心但前面要加WAF、輸入校驗(yàn)等前置攔截后面要加權(quán)限最小化、數(shù)據(jù)庫(kù)賬號(hào)分離、日志審計(jì)來(lái)兜底。2.2 越權(quán)漏洞憑什么用別人的賬號(hào)查行程越權(quán)漏洞在出行場(chǎng)景里出得很自然。題目給出一個(gè)場(chǎng)景一個(gè)用戶(hù)訂單查詢(xún)接口前端通過(guò)接口傳入訂單ID后端直接拿著這個(gè)ID去數(shù)據(jù)庫(kù)里查并返回訂單詳情沒(méi)有校驗(yàn)這個(gè)訂單是否屬于當(dāng)前登錄用戶(hù)。問(wèn)存在什么漏洞可能造成什么危害如何修復(fù)。這是典型的水平越權(quán)問(wèn)題——攻擊者可以通過(guò)遍歷訂單ID看到其他用戶(hù)的訂單信息。在出行行業(yè)訂單信息里包含真實(shí)姓名、手機(jī)號(hào)、上下車(chē)地點(diǎn)、行程軌跡數(shù)據(jù)泄露的后果比普通電商訂單嚴(yán)重得多。所以危害分析要分層寫(xiě)個(gè)人隱私泄露、人身安全風(fēng)險(xiǎn)可以實(shí)時(shí)掌握某個(gè)人的出行規(guī)律、合規(guī)風(fēng)險(xiǎn)違反個(gè)人信息保護(hù)相關(guān)要求。修復(fù)方案也要分層。最直接的是加權(quán)限校驗(yàn)查詢(xún)前判斷訂單的userId和當(dāng)前登錄用戶(hù)的userId是否一致。這是“對(duì)象級(jí)授權(quán)”的標(biāo)準(zhǔn)做法。但僅僅如此還不足以應(yīng)對(duì)復(fù)雜場(chǎng)景比如客服系統(tǒng)、司機(jī)端等不同的角色訪(fǎng)問(wèn)同一個(gè)訂單數(shù)據(jù)時(shí)需要的權(quán)限邊界是不同的這就要引入基于角色的訪(fǎng)問(wèn)控制模型來(lái)統(tǒng)一管理。從筆試角度還能加點(diǎn)分的是答出“對(duì)ID做不可預(yù)測(cè)化處理”——把自增ID替換成帶隨機(jī)性的業(yè)務(wù)單號(hào)降低枚舉風(fēng)險(xiǎn)。同時(shí)接口要做風(fēng)控和審計(jì)發(fā)現(xiàn)某個(gè)用戶(hù)短時(shí)間內(nèi)大量查詢(xún)他人訂單要能自動(dòng)觸發(fā)告警。2.3 支付金額篡改與“0元打車(chē)”支付安全在滴滴這類(lèi)交易型平臺(tái)里是重中之重。這年的簡(jiǎn)答題里有一道“支付金額篡改”題給了一個(gè)場(chǎng)景客戶(hù)端發(fā)起支付請(qǐng)求時(shí)把訂單金額傳給服務(wù)端服務(wù)端按客戶(hù)端傳的金額扣款攻擊者可以把金額改成0.01元甚至0元實(shí)現(xiàn)“低價(jià)打車(chē)”。這類(lèi)題的套路性很強(qiáng)但很多沒(méi)接觸過(guò)支付系統(tǒng)的人容易踩坑只答“服務(wù)端要校驗(yàn)金額”就結(jié)束了。實(shí)際上要從兩個(gè)層面理解。第一層是服務(wù)端信任邊界。任何從客戶(hù)端傳來(lái)的數(shù)據(jù)都不可信金額必須由服務(wù)端根據(jù)訂單信息計(jì)算不能以客戶(hù)端傳參為準(zhǔn)。這道題的關(guān)鍵修復(fù)點(diǎn)就在這服務(wù)端要做到“應(yīng)付金額以服務(wù)端訂單快照為準(zhǔn)客戶(hù)端只負(fù)責(zé)展示和發(fā)起支付”。更嚴(yán)謹(jǐn)?shù)淖龇ㄊ窍聠纬晒r(shí)服務(wù)端生成訂單快照并簽名支付時(shí)校驗(yàn)簽名和金額。第二層是防重放與防篡改。即使服務(wù)端算好了金額攻擊者也可以把同一個(gè)合法請(qǐng)求重放多次所以要有冪等控制。當(dāng)時(shí)的答題里如果能提到“每筆訂單生成唯一的業(yè)務(wù)流水號(hào)支付回調(diào)時(shí)按流水號(hào)做冪等校驗(yàn)”這題基本就是滿(mǎn)分水平。還有個(gè)容易被忽略的點(diǎn)是支付回調(diào)的安全。支付成功后第三方支付平臺(tái)會(huì)回調(diào)通知服務(wù)端這個(gè)回調(diào)必須驗(yàn)簽、驗(yàn)金額、驗(yàn)商戶(hù)訂單號(hào)否則攻擊者可以偽造支付成功通知。把這個(gè)點(diǎn)答進(jìn)去能明顯體現(xiàn)你的真實(shí)業(yè)務(wù)經(jīng)驗(yàn)。2.4 驗(yàn)證碼與短信轟炸的攻防博弈短信轟炸題也是那年的高頻題出題角度很實(shí)際“注冊(cè)和登錄接口都接了短信驗(yàn)證碼現(xiàn)在攻擊者用腳本調(diào)用接口給任意手機(jī)號(hào)發(fā)短信導(dǎo)致大量用戶(hù)被騷擾怎么防護(hù)”這道題考察的不只是驗(yàn)證碼本身而是對(duì)“人機(jī)對(duì)抗”的理解。回答時(shí)要區(qū)分“驗(yàn)證碼防機(jī)器”和“頻控防濫用”兩個(gè)維度。驗(yàn)證碼層面短信接口前面一定要掛行為驗(yàn)證碼。用戶(hù)要先完成滑塊或者點(diǎn)選驗(yàn)證證明自己是真人再觸發(fā)短信下發(fā)。這在2017年算比較成熟的方案了到今天也是標(biāo)配。頻控層面要分多個(gè)維度做限制同一手機(jī)號(hào)在單位時(shí)間內(nèi)的發(fā)送次數(shù)上限、同一IP的調(diào)用頻率限制、同一設(shè)備指紋的調(diào)用頻率限制、同一賬號(hào)的每日發(fā)送上限。這四個(gè)維度缺一不可單純限制手機(jī)號(hào)很容易被攻擊者換號(hào)繞過(guò)單純限制IP則防不住代理池。更高級(jí)的答法是把“陌生號(hào)碼”和“高頻異?!迸袛嗉舆M(jìn)去比如對(duì)未注冊(cè)的手機(jī)號(hào)做更嚴(yán)格的驗(yàn)證或是在夜間等非正常時(shí)段加大頻控力度。這也是業(yè)務(wù)場(chǎng)景里的實(shí)際需要。3. 移動(dòng)端逆向與客戶(hù)端安全真題還原3.1 APK靜態(tài)分析從反編譯到定位關(guān)鍵代碼2017年是移動(dòng)互聯(lián)網(wǎng)安全崗考察Android安全的巔峰期滴滴的App天然是重點(diǎn)目標(biāo)所以筆試卷子里有一道APK靜態(tài)分析的題。題目會(huì)給你一個(gè)場(chǎng)景拿到一個(gè)APK需要分析它的某個(gè)關(guān)鍵邏輯比如簽名校驗(yàn)、加密算法問(wèn)用什么工具、走什么流程。常規(guī)工具鏈要寫(xiě)全先是apktool解包拿到資源文件和smali代碼再用jadx或者jeb做反編譯從DEX字節(jié)碼還原出可讀性更好的Java代碼如果App用了加固可能還涉及脫殼那就要用到Frida或者Xposed來(lái)做運(yùn)行時(shí)dump。定位關(guān)鍵代碼的方式也很重要。最快的方式是全局搜索字符串比如搜索“sign”“token”“secret”“signature”這些關(guān)鍵詞能迅速把分析范圍縮小到幾個(gè)關(guān)鍵類(lèi)上。如果是找簽名校驗(yàn)可以搜索包名、Signature類(lèi)的getSignatures方法調(diào)用或者搜索PackageManager相關(guān)的API。從筆試判分的角度來(lái)看這題想拿高分的核心是“分析思路完整”拿到APK之后先看權(quán)限申請(qǐng)和組件暴露情況再看有沒(méi)有加殼、有沒(méi)有Native層最后才是具體的業(yè)務(wù)邏輯分析。這反映出分析者有完整的方法論而不是瞎猜。3.2 簽名校驗(yàn)與重打包一道送分題和它的坑簽名校驗(yàn)是移動(dòng)端安全的傳統(tǒng)考點(diǎn)滴滴那套卷子里也出現(xiàn)在了簡(jiǎn)答題中。題目問(wèn)的是APK重打包后無(wú)法安裝或運(yùn)行可能是什么原因如何分析如何繞過(guò)。核心原因就是簽名變了。APK的簽名相當(dāng)于應(yīng)用的身份證重打包后即使代碼邏輯改了簽名也和新版不一致系統(tǒng)安裝時(shí)就會(huì)校驗(yàn)失敗。而很多App還會(huì)在代碼里做自校驗(yàn)簽名不對(duì)直接閃退。分析方法是先把原APK和重打包APK的簽名信息都導(dǎo)出來(lái)對(duì)比一下MD5。如果App里做了自校驗(yàn)就要找到校驗(yàn)點(diǎn)看它是在Java層還是Native層做的。這道題的難點(diǎn)在于繞過(guò)。純Java層的簽名校驗(yàn)相對(duì)好處理用Frida hook住PackageManager的getPackageInfo方法讓它返回原始簽名就行。但如果有Native層的校驗(yàn)事情就變得復(fù)雜了需要?jiǎng)討B(tài)調(diào)試Native代碼找到校驗(yàn)邏輯后patch掉或者把正確的簽名信息傳給Native層校驗(yàn)函數(shù)。這里筆試答題時(shí)一定要強(qiáng)調(diào)“重打包防護(hù)”的對(duì)抗思路而不是只講怎么繞過(guò)。一個(gè)完整的修復(fù)方案應(yīng)該是在Java層和Native層分別做簽名校驗(yàn)并加反調(diào)試讓攻擊者定位校驗(yàn)點(diǎn)的成本大幅提升。這才能體現(xiàn)你既會(huì)攻也知道怎么防。3.3 動(dòng)態(tài)調(diào)試與反調(diào)試so層的攻防拉鋸動(dòng)態(tài)調(diào)試那題更進(jìn)階考的是Native層的反調(diào)試對(duì)抗。場(chǎng)景大概是一個(gè)Android應(yīng)用把核心算法放在so文件里你在動(dòng)態(tài)調(diào)試時(shí)發(fā)現(xiàn)進(jìn)程一掛上調(diào)試器就退出問(wèn)為什么如何繞過(guò)。核心知識(shí)點(diǎn)是先答出幾種常見(jiàn)的反調(diào)試手段一是ptrace自跟蹤。Linux的ptrace有一個(gè)特性同一個(gè)進(jìn)程同一時(shí)刻只能被一個(gè)進(jìn)程跟蹤。App自己ptrace(PTRACE_TRACEME)調(diào)試器就無(wú)法再attach上來(lái)。這是最常見(jiàn)、也最經(jīng)典的反調(diào)試手段。二是檢測(cè)調(diào)試器狀態(tài)。通過(guò)讀取/proc/self/status文件里的TracerPid字段如果非零說(shuō)明有進(jìn)程在跟蹤自己直接退出。此外android:debuggable標(biāo)志、Debug.isDebuggerConnected()、檢測(cè)daemons進(jìn)程里的jdwp線(xiàn)程都是在Java層常見(jiàn)的手?jǐn)?。三是?duì)關(guān)鍵so文件做完整性校驗(yàn)。用CRC或者哈希算法實(shí)時(shí)計(jì)算so文件在內(nèi)存中的哈希值和原始值比對(duì)不一致就退出。這種方式專(zhuān)門(mén)針對(duì)內(nèi)存patch型繞過(guò)。繞過(guò)反調(diào)試的常規(guī)思路也有幾個(gè)方向一是讓ptrace失敗比如先于App對(duì)自身做一次ptrace或者用gdb的set follow-fork-mode child這類(lèi)操作躲開(kāi)反調(diào)試二是hook住反調(diào)試函數(shù)直接讓檢測(cè)函數(shù)返回“正?!比莗atch關(guān)鍵跳轉(zhuǎn)指令把“檢測(cè)到調(diào)試器就退出”改成“檢測(cè)到調(diào)試器也繼續(xù)執(zhí)行”。其實(shí)這類(lèi)題在筆試?yán)锟嫉牟皇悄阏娴默F(xiàn)場(chǎng)把so調(diào)通了而是你有沒(méi)有真正調(diào)過(guò)、知不知道常見(jiàn)的對(duì)抗點(diǎn)在哪。能答出幾種反調(diào)試原理和對(duì)應(yīng)的繞過(guò)思路就已經(jīng)是很好的答案了。4. 密碼學(xué)與安全基礎(chǔ)知識(shí)真題還原4.1 加密算法選擇題AES、RSA、哈希該怎么選密碼學(xué)這塊的選擇題考的通常不是讓你手算密鑰而是考察算法選型能力和基礎(chǔ)概念辨析。滴滴那次筆試?yán)锞陀幸坏篮芙?jīng)典的選型題給出幾個(gè)場(chǎng)景讓你選合適的算法。第一個(gè)場(chǎng)景是“登錄密碼傳輸”問(wèn)用RSA加密還是用HTTPS。這道題的坑在于有些同學(xué)會(huì)認(rèn)為密碼傳輸必須用RSA加密。但正確的理解應(yīng)該是傳輸層安全優(yōu)先靠HTTPSTLS保證密碼字段本身再做一次加密屬于縱深防御如果只對(duì)密碼做RSA加密而不用HTTPS中間人依然可以替換整個(gè)請(qǐng)求加密強(qiáng)度再高也沒(méi)用。第二個(gè)場(chǎng)景是“用戶(hù)密碼存儲(chǔ)”選項(xiàng)里有MD5、SHA-1、加鹽哈希。正確答案是加鹽哈希最好用bcrypt、scrypt這類(lèi)慢哈希算法。MD5和SHA-1都不是為密碼存儲(chǔ)設(shè)計(jì)的算得太快暴力破解效率太高這是2017年已經(jīng)反復(fù)被驗(yàn)證過(guò)的教訓(xùn)。第三個(gè)場(chǎng)景是“數(shù)據(jù)完整性校驗(yàn)”選項(xiàng)里有AES、RSA、哈希。正確思路是使用哈?;蛘咴趥鬏攬?chǎng)景里用MAC消息認(rèn)證碼特別是帶密鑰的HMAC這樣才能防止攻擊者同時(shí)篡改數(shù)據(jù)和數(shù)據(jù)對(duì)應(yīng)的哈希值。4.2 密碼存儲(chǔ)為什么“加鹽”不是可選項(xiàng)簡(jiǎn)答題里有一道關(guān)于密碼存儲(chǔ)的題題目直白得像送分“數(shù)據(jù)庫(kù)里用戶(hù)的密碼應(yīng)該怎么存為什么不能直接存MD5加鹽是什么意思鹽值應(yīng)該怎么處理”直接存MD5的問(wèn)題在于用戶(hù)的密碼往往強(qiáng)度不高攻擊者拿到哈希之后可以做彩虹表查表或者直接用常見(jiàn)密碼字典批量跑。MD5算得太快一個(gè)GPU每秒可以算幾十億次即使不用彩虹表窮舉弱密碼也很快?!凹欲}”的意思就是在原始密碼后面拼接一段隨機(jī)字符串再做哈希。這樣即使兩個(gè)用戶(hù)密碼一樣加鹽后的哈希值也不一樣。更重要的是鹽值增大了彩虹表的構(gòu)建成本——攻擊者沒(méi)辦法提前為所有可能的“密碼鹽”組合預(yù)計(jì)算彩虹表。鹽值的設(shè)計(jì)有幾個(gè)關(guān)鍵點(diǎn)鹽值必須每個(gè)用戶(hù)獨(dú)立、隨機(jī)生成不能全局共用一個(gè)鹽鹽值長(zhǎng)度要足夠長(zhǎng)一般16字節(jié)以上鹽值本身不需要保密可以明文存儲(chǔ)因?yàn)樗淖饔檬窃黾悠平獬杀径皇请[藏信息。這時(shí)候用bcrypt、scrypt、PBKDF2這類(lèi)慢哈希算法效果更好它們通過(guò)增加計(jì)算輪數(shù)把每次撞庫(kù)的時(shí)間成本放大到“不可接受”的量級(jí)。答題時(shí)要能把這個(gè)邏輯鏈說(shuō)完整為什么不能直接存MD5因?yàn)樗愕每臁⒂胁屎绫砑欲}解決了什么解決了同一密碼同樣哈希、彩虹表預(yù)計(jì)算為什么用慢哈希因?yàn)檫M(jìn)一步拖慢離線(xiàn)破解速度。4.3 數(shù)字簽名從網(wǎng)約車(chē)夜間出行資質(zhì)談起這套卷子里還有一道關(guān)于數(shù)字簽名的題出題角度很巧妙——它沒(méi)有讓你直接解釋“什么是數(shù)字簽名”而是結(jié)合了一個(gè)和出行服務(wù)相關(guān)的場(chǎng)景平臺(tái)和司機(jī)之間需要建立一種信任機(jī)制確保某些關(guān)鍵指令比如夜間出行資質(zhì)審核結(jié)果、緊急狀態(tài)下的報(bào)文確實(shí)來(lái)自平臺(tái)且未被篡改問(wèn)你怎么設(shè)計(jì)。其實(shí)這就是數(shù)字簽名在真實(shí)業(yè)務(wù)里的典型應(yīng)用。用平臺(tái)的私鑰對(duì)報(bào)文內(nèi)容做簽名司機(jī)端拿到報(bào)文后用平臺(tái)公鑰驗(yàn)簽。驗(yàn)簽通過(guò)就能同時(shí)證明兩件事第一報(bào)文確實(shí)來(lái)自平臺(tái)身份認(rèn)證第二報(bào)文內(nèi)容沒(méi)有被中間人篡改過(guò)數(shù)據(jù)完整性。要強(qiáng)調(diào)私鑰只能保存在服務(wù)端公鑰分發(fā)到客戶(hù)端。如果私鑰泄露整個(gè)信任體系就崩塌了。在移動(dòng)App場(chǎng)景里通常還會(huì)把公鑰固化到客戶(hù)端代碼里甚至放到Native層防止攻擊者直接替換公鑰做中間人攻擊。這道題想拿高分還可以結(jié)合“防重放”來(lái)答數(shù)字簽名本身能防篡改但防不了攻擊者把合法報(bào)文保存下來(lái)再次發(fā)送所以業(yè)務(wù)報(bào)文里要加入時(shí)間戳、隨機(jī)數(shù)或單調(diào)遞增的序列號(hào)服務(wù)端校驗(yàn)這些信息來(lái)防止重放攻擊。5. 業(yè)務(wù)風(fēng)控與安全運(yùn)營(yíng)場(chǎng)景題5.1 刷單問(wèn)題的風(fēng)控方案設(shè)計(jì)綜合分析題里最典型的一道是刷單反作弊網(wǎng)約車(chē)平臺(tái)存在司機(jī)刷單行為比如司機(jī)和乘客勾結(jié)制造虛假行程騙取平臺(tái)補(bǔ)貼問(wèn)你怎么從安全角度設(shè)計(jì)風(fēng)控方案。這道題拼的不是單一漏洞利用能力而是方案設(shè)計(jì)能力。一個(gè)完整的反刷單體系至少要覆蓋“事前、事中、事后”三個(gè)環(huán)節(jié)。事前環(huán)節(jié)要做準(zhǔn)入風(fēng)控。新司機(jī)注冊(cè)時(shí)要做實(shí)名認(rèn)證、人臉核驗(yàn)、設(shè)備指紋采集。同時(shí)要建立關(guān)系圖譜識(shí)別司機(jī)和乘客之間是否存在異常關(guān)聯(lián)——比如某個(gè)乘客長(zhǎng)期只打同一個(gè)司機(jī)的車(chē)社交關(guān)系異常緊密這種單子的風(fēng)險(xiǎn)就偏高。事中環(huán)節(jié)要做實(shí)時(shí)監(jiān)控。要在訂單流轉(zhuǎn)的關(guān)鍵節(jié)點(diǎn)埋點(diǎn)包括下單、接單、行程開(kāi)始、行程結(jié)束、支付完成。每個(gè)節(jié)點(diǎn)都采集設(shè)備信息、GPS信息、操作行為、時(shí)間分布。通過(guò)特征工程提取異常指標(biāo)比如司機(jī)接單后長(zhǎng)時(shí)間低速怠速行駛、同一批司機(jī)經(jīng)常在同一時(shí)間同一區(qū)域接單、司機(jī)端和乘客端的操作間隔異常短暫等。事后環(huán)節(jié)要做處置與舉證。確認(rèn)風(fēng)控模型命中之后不是簡(jiǎn)單封號(hào)就完事要能提供完整的證據(jù)鏈用于人工審核和可能的申訴流程。這就要做好日志留存、軌跡回放和數(shù)據(jù)快照。這個(gè)答題框架比單純列舉某一種風(fēng)控策略要完整得多也更能體現(xiàn)出你做過(guò)反作弊或風(fēng)控相關(guān)的工作。5.2 撞庫(kù)與撞庫(kù)之后賬號(hào)安全三道防線(xiàn)賬號(hào)安全是出行平臺(tái)的重災(zāi)區(qū)因?yàn)橛脩?hù)經(jīng)常用手機(jī)號(hào)注冊(cè)而手機(jī)號(hào)在其他平臺(tái)泄露的概率極高。筆試?yán)镉幸坏谰C合分析題給出的場(chǎng)景是發(fā)現(xiàn)大量賬號(hào)在短時(shí)間內(nèi)被異地登錄并且部分賬號(hào)出現(xiàn)了異常行程要求分析攻擊方式并提出解決方案。答案的核心是“撞庫(kù)”——攻擊者拿著從其他平臺(tái)泄露的賬號(hào)密碼拿到滴滴的登錄接口上批量嘗試。因?yàn)榇罅坑脩?hù)習(xí)慣在不同平臺(tái)使用相同密碼撞庫(kù)的成功率相當(dāng)可觀。這個(gè)問(wèn)題要從三道防線(xiàn)來(lái)設(shè)計(jì)第一道防線(xiàn)是登錄入口。要能識(shí)別“批量自動(dòng)化登錄”的行為特征比如登錄頻率異常、IP集中但分布分散、User-Agent異常等。常用的手段包括設(shè)備指紋、行為驗(yàn)證碼、IP信譽(yù)庫(kù)、頻率限制。第二道防線(xiàn)是風(fēng)險(xiǎn)登錄后的二次驗(yàn)證。當(dāng)賬號(hào)在異地、新設(shè)備上登錄時(shí)強(qiáng)制要求短信驗(yàn)證碼或人臉驗(yàn)證。這個(gè)策略在2017年已經(jīng)有不少應(yīng)用核心邏輯是“低頻正常用戶(hù)無(wú)感知高風(fēng)險(xiǎn)登錄才觸發(fā)額外認(rèn)證”。第三道防線(xiàn)是登錄后的行為監(jiān)控。即使攻擊者突破了前兩道防線(xiàn)也不應(yīng)該暢通無(wú)阻。要用風(fēng)控模型監(jiān)測(cè)賬號(hào)的異常行為比如短時(shí)間內(nèi)大量叫車(chē)、連續(xù)修改支付方式、查看陌生人行程等。一旦觸發(fā)自動(dòng)凍結(jié)或限制賬號(hào)部分功能。答題時(shí)如果能補(bǔ)充“撞庫(kù)之后的數(shù)據(jù)泄露閉環(huán)”加分很多——不僅要防撞庫(kù)還要假設(shè)撞庫(kù)已經(jīng)成功做好賬號(hào)異常后的通知、快速申訴、證據(jù)固定等措施。5.3 數(shù)據(jù)安全視角軌跡、手機(jī)號(hào)這些敏感數(shù)據(jù)怎么管數(shù)據(jù)安全題在2017年的安全崗筆試?yán)锍霈F(xiàn)頻率還不算特別高但滴滴這張卷子已經(jīng)把它放進(jìn)來(lái)了。題目很直接用戶(hù)行程數(shù)據(jù)中包含GPS軌跡、手機(jī)號(hào)、常用地址問(wèn)這些數(shù)據(jù)在存儲(chǔ)、傳輸、使用環(huán)節(jié)分別要做哪些安全措施。存儲(chǔ)環(huán)節(jié)要強(qiáng)調(diào)分級(jí)分類(lèi)與加密。GPS軌跡和手機(jī)號(hào)的敏感度不同要分開(kāi)管理。手機(jī)號(hào)屬于直接個(gè)人敏感信息必須加密存儲(chǔ)GPS軌跡屬于高敏位置數(shù)據(jù)不僅要加密還要做權(quán)限管控只有特定角色才能解密訪(fǎng)問(wèn)。建議用獨(dú)立的密鑰管理系統(tǒng)對(duì)不同級(jí)別數(shù)據(jù)使用不同密鑰并且定期輪換。傳輸環(huán)節(jié)要全程走加密通道內(nèi)部服務(wù)之間用mTLS雙向認(rèn)證。同時(shí)要防止日志側(cè)漏很多數(shù)據(jù)泄露不是數(shù)據(jù)庫(kù)被拖而是開(kāi)發(fā)調(diào)試時(shí)把敏感字段直接打到日志里了。所以還要做日志脫敏手機(jī)號(hào)、身份證號(hào)這類(lèi)字段在日志里必須打碼。使用環(huán)節(jié)要強(qiáng)調(diào)脫敏與審計(jì)。數(shù)據(jù)給到業(yè)務(wù)方使用之前能脫敏就脫敏比如手機(jī)號(hào)顯示前三后四不能脫敏的場(chǎng)景要有嚴(yán)格的審批流程和操作留痕誰(shuí)在什么時(shí)間查看了哪段軌跡都要有完整審計(jì)。這是數(shù)據(jù)安全里比加密更難落地的一環(huán)。這道題要想拿高分還要點(diǎn)出“數(shù)據(jù)最小化”原則不該采集的不采集該刪除的定期刪除。行程軌跡在完成了安全事件溯源、客服仲裁等用途之后應(yīng)當(dāng)按生命周期策略自動(dòng)清理。6. 考完復(fù)盤(pán)這種筆試題型背后的安全觀6.1 從真題倒推崗位畫(huà)像滴滴安全團(tuán)隊(duì)想要什么人整套卷子做下來(lái)對(duì)“滴滴安全團(tuán)隊(duì)想要什么人”這件事會(huì)越來(lái)越清晰。它要的不是只會(huì)挖洞的“漏洞獵人”而是能夠把安全能力植入業(yè)務(wù)鏈路的安全工程師。從題型占比能看出來(lái)純漏洞原理題并不是重點(diǎn)重點(diǎn)在于“業(yè)務(wù)場(chǎng)景安全方案”。越權(quán)漏洞不是考你“什么是水平越權(quán)”而是考你在“訂單查詢(xún)”場(chǎng)景里怎么防反作弊不是考你“什么叫風(fēng)控”而是考你在“司機(jī)刷單”場(chǎng)景里怎么設(shè)計(jì)策略。這說(shuō)明團(tuán)隊(duì)在選人時(shí)最看重的是候選人能不能把安全技術(shù)轉(zhuǎn)化成對(duì)業(yè)務(wù)的保護(hù)能力。Android安全題的占比高也映射出當(dāng)時(shí)客戶(hù)端安全在出行領(lǐng)域的重點(diǎn)地位。網(wǎng)約車(chē)的核心操作都在App上司機(jī)端、乘客端、管理端都是攻擊面所以團(tuán)隊(duì)需要既懂逆向又懂業(yè)務(wù)的人而不只是會(huì)做滲透測(cè)試。6.2 針對(duì)出行場(chǎng)景的備考路線(xiàn)建議如果你現(xiàn)在準(zhǔn)備投這類(lèi)出行領(lǐng)域的安全崗可以考慮把復(fù)習(xí)重點(diǎn)放在幾條主線(xiàn)上。Web安全方面SQL注入、XSS、CSRF、SSRF、越權(quán)這些常見(jiàn)漏洞的“原理修復(fù)”都要滾瓜爛熟尤其是越權(quán)和業(yè)務(wù)邏輯漏洞建議在本地搭個(gè)靶場(chǎng)實(shí)際跑一遍把漏洞從發(fā)現(xiàn)到利用再到修復(fù)的完整鏈路走通。移動(dòng)端安全方面至少要能獨(dú)立完成一個(gè)APK的靜態(tài)分析和動(dòng)態(tài)調(diào)試流程。熟悉apktool、jadx、Frida的常見(jiàn)用法知道簽名校驗(yàn)、反調(diào)試、so層加固的基本原理這些都是2017年那場(chǎng)筆試的高頻考點(diǎn)也是移動(dòng)安全崗的基礎(chǔ)功。業(yè)務(wù)風(fēng)控方面建議多看一些反作弊、反欺詐的案例重點(diǎn)理解設(shè)備指紋、關(guān)系圖譜、行為序列這些概念。不要只停留在概念層面最好能結(jié)合平時(shí)接觸的產(chǎn)品想想某個(gè)業(yè)務(wù)環(huán)節(jié)如果被攻擊攻擊面在哪里、防御點(diǎn)在哪里。數(shù)據(jù)安全方面要建立“生命周期”視角從數(shù)據(jù)采集、傳輸、存儲(chǔ)、使用到銷(xiāo)毀每個(gè)環(huán)節(jié)的安全措施分別是什么。這套思路在出行行業(yè)尤其受用。6.3 最后一點(diǎn)個(gè)人小心得我當(dāng)年給朋友復(fù)盤(pán)這套筆試題的時(shí)候說(shuō)過(guò)一句話(huà)滴滴安全崗的筆試題表面考安全本質(zhì)上考的是你能不能站在業(yè)務(wù)方的角度思考問(wèn)題。很多人在筆試時(shí)只想著“這道題漏洞原理我背過(guò)”卻忽略了題目給出的業(yè)務(wù)場(chǎng)景信息。比如越權(quán)題里特意強(qiáng)調(diào)了“行程信息可以定位到家庭住址”支付題里特意寫(xiě)了“司機(jī)端是高頻使用場(chǎng)景”這些都不是廢話(huà)而是引導(dǎo)你把答案往業(yè)務(wù)方向上寫(xiě)。我的建議是做這種場(chǎng)景題先花幾分鐘把業(yè)務(wù)角色梳理清楚誰(shuí)能訪(fǎng)問(wèn)什么數(shù)據(jù)、什么操作會(huì)觸發(fā)什么風(fēng)險(xiǎn)、風(fēng)險(xiǎn)發(fā)生之后用戶(hù)和平臺(tái)各自的損失是什么。把這三件事想明白了答案自然就有層次了。真正在工作里做安全也是這樣——先搞懂業(yè)務(wù)再去設(shè)計(jì)防御方案才能落到地上。