聽(tīng)說(shuō)你是程序員,可以幫我盜個(gè) QQ 嗎?這都不會(huì)還當(dāng)什么程序員!
聽(tīng)說(shuō)你是程序員,可以幫我盜個(gè) QQ 號(hào)嗎?這個(gè)段子估計(jì)很多朋友都看過(guò),程序員被黑過(guò)無(wú)數(shù)次。

在其他人眼中,仿佛我們需要寫(xiě)得了木馬,翻得了圍墻,修得了電腦,找得到資源,但凡是跟計(jì)算機(jī)沾點(diǎn)邊的,咱都得會(huì)才行。
段子歸段子,言歸正傳,對(duì)于咱們程序員來(lái)說(shuō),多多少少了解一些信息安全的技術(shù)知識(shí)還是大有裨益的,不僅能了解一些計(jì)算機(jī)和網(wǎng)絡(luò)的底層原理,也能反哺我們的開(kāi)發(fā)工作,帶著安全思維編程,減少漏洞的產(chǎn)生。
作者:軒轅之風(fēng)
編輯:陶家龍
出處:轉(zhuǎn)載自微信公眾號(hào)編程技術(shù)宇宙(ID:ProgramUniverse)
本文內(nèi)容:
- 網(wǎng)絡(luò)安全
- SQL注入
- XSS攻擊
- CSRF攻擊
- DDoS攻擊
- DNS劫持
- TCP劫持
- 端口掃描技術(shù)
- 系統(tǒng)安全
- 棧溢出攻擊
- 整數(shù)溢出攻擊
- 空指針攻擊
- 釋放后使用攻擊
- HOOK
- 權(quán)限提升
- 可信計(jì)算
- 密碼學(xué)
- 對(duì)稱加密 & 非對(duì)稱加密
- 秘鑰交換技術(shù)
- 信息摘要算法
- 數(shù)據(jù)編碼技術(shù)
- 多因子認(rèn)證技術(shù)
信息安全大體可分為三個(gè)大的分支:
網(wǎng)絡(luò)安全
系統(tǒng)安全
密碼學(xué)
下面我就這三個(gè)領(lǐng)域分別羅列一些常用的黑客技術(shù),部分技術(shù)是存在領(lǐng)域交叉的,就將其劃入主要那個(gè)類別里去了。
網(wǎng)絡(luò)安全
①SQL 注入
Web 安全三板斧之首,大名鼎鼎的 SQL 注入。

SQL 注入攻擊的核心在于讓 Web 服務(wù)器執(zhí)行攻擊者期望的 SQL 語(yǔ)句,以便得到數(shù)據(jù)庫(kù)中的感興趣的數(shù)據(jù)或?qū)?shù)據(jù)庫(kù)進(jìn)行讀取、修改、刪除、插入等操作,達(dá)到其邪惡的目的。
而如何讓 Web 服務(wù)器執(zhí)行攻擊者的 SQL 語(yǔ)句呢?SQL 注入的常規(guī)套路在于將 SQL 語(yǔ)句放置于 Form 表單或請(qǐng)求參數(shù)之中提交到后端服務(wù)器,后端服務(wù)器如果未做輸入安全校驗(yàn),直接將變量取出進(jìn)行數(shù)據(jù)庫(kù)查詢,則極易中招。

舉例如下,對(duì)于一個(gè)根據(jù)用戶 ID 獲取用戶信息的接口,后端的 SQL 語(yǔ)句一般是這樣:
selectname,[...]?fromt_user?whereid=$?id
其中,$id 就是前端提交的用戶 id,而如果前端的請(qǐng)求是這樣:
GETxx/userinfo?id=1?%20or?%201=1
其中請(qǐng)求參數(shù) id 轉(zhuǎn)義后就是 1 or 1=1,如果后端不做安全過(guò)濾直接提交數(shù)據(jù)庫(kù)查詢,SQL 語(yǔ)句就變成了:
selectname,[...]?fromt_user?whereid=?1or1=?1
其結(jié)果是把用戶表中的所有數(shù)據(jù)全部查出,達(dá)到了黑客泄露數(shù)據(jù)的目的。
以上只是一個(gè)極簡(jiǎn)單的示例,在真實(shí)的 SQL 注入攻擊中參數(shù)構(gòu)造和 SQL 語(yǔ)句遠(yuǎn)比這復(fù)雜得多,不過(guò)原理是一致的。

防御手段:對(duì)輸入進(jìn)行檢測(cè),阻斷帶有 SQL 語(yǔ)句特征對(duì)輸入。
重點(diǎn)關(guān)注:前端工程師、Web 后端工程師。
②XSS 攻擊
Web 安全三板斧之二,全稱跨站腳本攻擊(Cross Site ing),為了與重疊樣式表 CSS 區(qū)分,換了另一個(gè)縮寫(xiě) XSS。

XSS 攻擊的核心是將可執(zhí)行的前端腳本代碼(一般為 Java)植入到網(wǎng)頁(yè)中,聽(tīng)起來(lái)比較拗口,用大白話說(shuō)就是攻擊者想讓你的瀏覽器執(zhí)行他寫(xiě)的 JS 代碼。
那如何辦到呢?一般 XSS 分為兩種:

反射型如上圖:
攻擊者將 JS 代碼作為請(qǐng)求參數(shù)放置 URL 中,誘導(dǎo)用戶點(diǎn)擊,示例:
http://localhost:8080/test?name=?<?>alert(?"you are under attack!")
用戶點(diǎn)擊后,該 JS 作為請(qǐng)求參數(shù)傳給 Web 服務(wù)器后端。
后端服務(wù)器沒(méi)有檢查過(guò)濾,簡(jiǎn)單處理后放入網(wǎng)頁(yè)正文中返回給瀏覽器。
瀏覽器解析返回的網(wǎng)頁(yè),中招!

存儲(chǔ)型如上圖:上述方式攻擊腳本直接經(jīng)服務(wù)器轉(zhuǎn)手后返回瀏覽器觸發(fā)執(zhí)行,存儲(chǔ)型與之的區(qū)別在于能夠?qū)⒐裟_本入庫(kù)存儲(chǔ),在后面進(jìn)行查詢時(shí),再將攻擊腳本渲染進(jìn)網(wǎng)頁(yè),返回給瀏覽器觸發(fā)執(zhí)行。
常見(jiàn)的套路舉例如下:
攻擊者網(wǎng)頁(yè)回帖,帖子中包含 JS 腳本
回帖提交服務(wù)器后,存儲(chǔ)至數(shù)據(jù)庫(kù)
其他網(wǎng)友查看帖子,后臺(tái)查詢?cè)撎拥幕靥麅?nèi)容,構(gòu)建完整網(wǎng)頁(yè),返回瀏覽器
該網(wǎng)友瀏覽器渲染返回的網(wǎng)頁(yè),中招!
防御手段:前后端均需要做好內(nèi)容檢測(cè),過(guò)濾掉可執(zhí)行腳本的侵入。
重點(diǎn)關(guān)注:前端工程師、Web 后端工程師。
③CSRF 攻擊
Web 安全三板斧之三,攻擊示意圖如下:

核心思想在于,在打開(kāi) A 網(wǎng)站的情況下,另開(kāi) Tab 頁(yè)面打開(kāi)惡意網(wǎng)站 B,此時(shí)在 B 頁(yè)面的“唆使”下,瀏覽器發(fā)起一個(gè)對(duì)網(wǎng)站 A 的 HTTP 請(qǐng)求。
這個(gè)過(guò)程的危害在于兩點(diǎn):
這個(gè) HTTP 請(qǐng)求不是用戶主動(dòng)意圖,而是 B“唆使的”,如果是一個(gè)危害較大的請(qǐng)求操作(發(fā)郵件?刪數(shù)據(jù)?等等)那就麻煩了。
因?yàn)橹?A 網(wǎng)站已經(jīng)打開(kāi)了,瀏覽器存有 A 下發(fā)的 Cookie 或其他用于身份認(rèn)證的信息,這一次被“唆使”的請(qǐng)求,將會(huì)自動(dòng)帶上這些信息,A 網(wǎng)站后端分不清楚這是否是用戶真實(shí)的意愿。
重點(diǎn)關(guān)注:前端工程師、Web 后端工程師。
④DDoS 攻擊
DDoS 全稱 Distributed Denial of Service:分布式拒絕服務(wù)攻擊。是拒絕服務(wù)攻擊的升級(jí)版。拒絕攻擊服務(wù)顧名思義,讓服務(wù)不可用。

常用于攻擊對(duì)外提供服務(wù)的服務(wù)器,像常見(jiàn)的:
Web 服務(wù)
郵件服務(wù)
DNS 服務(wù)
即時(shí)通訊服務(wù)
......
在早期互聯(lián)網(wǎng)技術(shù)還沒(méi)有那么發(fā)達(dá)的時(shí)候,發(fā)起 DoS 攻擊是一件很容易的事情:一臺(tái)性能強(qiáng)勁的計(jì)算機(jī),寫(xiě)個(gè)程序多線程不斷向服務(wù)器進(jìn)行請(qǐng)求,服務(wù)器應(yīng)接不暇,最終無(wú)法處理正常的請(qǐng)求,對(duì)別的正常用戶來(lái)說(shuō),看上去網(wǎng)站貌似無(wú)法訪問(wèn),拒絕服務(wù)就是這么個(gè)意思。
后來(lái)隨著技術(shù)對(duì)發(fā)展,現(xiàn)在的服務(wù)器早已不是一臺(tái)服務(wù)器那么簡(jiǎn)單,你訪問(wèn)一個(gè) www.baidu.com 的域名,背后是數(shù)不清的 CDN 節(jié)點(diǎn),數(shù)不清的 Web 服務(wù)器。
這種情況下,還想靠單臺(tái)計(jì)算機(jī)去試圖讓一個(gè)網(wǎng)絡(luò)服務(wù)滿載,無(wú)異于雞蛋碰石頭,對(duì)方?jīng)]趴下,自己先趴下了。

技術(shù)從來(lái)都是一柄雙刃劍,分布式技術(shù)既可以用來(lái)提供高可用的服務(wù),也能夠被攻擊方用來(lái)進(jìn)行大規(guī)模殺傷性攻擊。

攻擊者不再局限于單臺(tái)計(jì)算機(jī)的攻擊能力,轉(zhuǎn)而通過(guò)成規(guī)模的網(wǎng)絡(luò)集群發(fā)起拒絕服務(wù)攻擊。
拒絕服務(wù)攻擊實(shí)際上是一類技術(shù),根據(jù)具體實(shí)施手段的不同,又可以進(jìn)一步細(xì)分:
SYN Flood
ICMP Flood
UDP Flood
......
防御手段:即便是到現(xiàn)在,面對(duì) DDoS 也沒(méi)有 100% 打包票的防御方法,只能靠一些緩解技術(shù)一定層面上減輕攻擊的威力。這些技術(shù)包括:流量清洗、SYN Cookie 等等。
重點(diǎn)關(guān)注:運(yùn)維工程師、安全工程師。
⑤DNS 劫持
當(dāng)今互聯(lián)網(wǎng)流量中,以 HTTP/HTTPS 為主的 Web 服務(wù)產(chǎn)生的流量占據(jù)了絕大部分。
Web 服務(wù)發(fā)展的如火如荼,這背后離不開(kāi)一個(gè)默默無(wú)聞的大功臣就是域名解析系統(tǒng):

如果沒(méi)有 DNS,我們上網(wǎng)需要記憶每個(gè)網(wǎng)站的 IP 地址而不是他們的域名,這簡(jiǎn)直是災(zāi)難,好在 DNS 默默在背后做了這一切,我們只需要記住一個(gè)域名,剩下的交給 DNS 來(lái)完成吧。
也正是因?yàn)槠渲匾?,別有用心的人自然是不會(huì)放過(guò)它,DNS 劫持技術(shù)被發(fā)明了出來(lái)。
DNS 提供服務(wù)用來(lái)將域名轉(zhuǎn)換成 IP 地址,然而在早期協(xié)議的設(shè)計(jì)中并沒(méi)有太多考慮其安全性,對(duì)于查詢方來(lái)說(shuō):
我去請(qǐng)求的真的是一個(gè) DNS 服務(wù)器嗎?是不是別人冒充的?
查詢的結(jié)果有沒(méi)有被人篡改過(guò)?這個(gè) IP 真是這個(gè)網(wǎng)站的嗎?

DNS 協(xié)議中沒(méi)有機(jī)制去保證能回答這些問(wèn)題,因此 DNS 劫持現(xiàn)象非常泛濫,從用戶在地址欄輸入一個(gè)域名的那一刻起,一路上的兇險(xiǎn)防不勝防:
本地計(jì)算機(jī)中的木馬修改 hosts 文件
本地計(jì)算機(jī)中的木馬修改 DNS 數(shù)據(jù)包中的應(yīng)答
網(wǎng)絡(luò)中的節(jié)點(diǎn)(如路由器)修改 DNS 數(shù)據(jù)包中的應(yīng)答
網(wǎng)絡(luò)中的節(jié)點(diǎn)(如運(yùn)營(yíng)商)修改 DNS 數(shù)據(jù)包中的應(yīng)答

......
后來(lái),為了在客戶端對(duì)收到對(duì) DNS 應(yīng)答進(jìn)行校驗(yàn),出現(xiàn)了 DNSSEC 技術(shù),一定程度上可以解決上面的部分問(wèn)題。
但限于一些方面的原因,這項(xiàng)技術(shù)并沒(méi)有大規(guī)模用起來(lái),尤其在國(guó)內(nèi),鮮有部署應(yīng)用。

再后來(lái),以阿里、騰訊等頭部互聯(lián)網(wǎng)廠商開(kāi)始推出了 httpDNS 服務(wù),來(lái)了一招釜底抽薪。
雖然這項(xiàng)技術(shù)的名字中還有 DNS 三個(gè)字母,但實(shí)現(xiàn)上和原來(lái)但 DNS 已經(jīng)是天差地別,通過(guò)這項(xiàng)技術(shù)讓 DNS 變成了在 http 協(xié)議之上的一個(gè)應(yīng)用服務(wù)。
重點(diǎn)關(guān)注:安全工程師、后端工程師、運(yùn)維工程師。
⑥TCP 劫持

TCP 是 TCP/IP 協(xié)議族中非常重要的成員,位于傳輸層。協(xié)議本身并沒(méi)有對(duì) TCP 傳輸?shù)臄?shù)據(jù)包進(jìn)行身份驗(yàn)證。
所以我們只要知道一個(gè) TCP 連接中的 seq 和 ack 后就可以很容易的偽造傳輸包,假裝任意一方與另一方進(jìn)行通信,我們將這一過(guò)程稱為 TCP 會(huì)話劫持(TCP Session Hijacking)。

TCP 劫持技術(shù)是一種很老的技術(shù),1995 年被提出來(lái)后深受黑客青睞。不過(guò)近些年來(lái),隨著操作系統(tǒng)層面的安全機(jī)制增強(qiáng)和防火墻軟件的檢測(cè)能力提升,這種基礎(chǔ)的攻擊方式越來(lái)越容易被發(fā)現(xiàn),慢慢的淡出了人們的視野。
重點(diǎn)關(guān)注:安全工程師、運(yùn)維工程師。
⑦端口掃描技術(shù)
端口掃描是黑客經(jīng)常使用的一種技術(shù),它一般是作為網(wǎng)絡(luò)攻擊的前期階段,用于探測(cè)目標(biāo)開(kāi)啟了哪些服務(wù),以便接下來(lái)發(fā)起針對(duì)該服務(wù)的攻擊。
記得剛剛學(xué)習(xí)網(wǎng)絡(luò)安全的時(shí)候,大家總會(huì)沒(méi)事拿出工具來(lái)掃一掃,雖然掃了之后就沒(méi)有了下文,也總是樂(lè)此不疲,在不懂的人面前秀一把自己的“黑客”能力。

以 TCP/IP 協(xié)議族構(gòu)建的互聯(lián)網(wǎng),網(wǎng)絡(luò)服務(wù)總是離不開(kāi)端口這個(gè)概念,不管是 TCP 也好,UDP 也罷,應(yīng)用層都需要一個(gè)端口號(hào)來(lái)進(jìn)行網(wǎng)絡(luò)通信。
而我們常見(jiàn)的服務(wù)端口有:
21: FTP 文件傳輸服務(wù)
25: SMTP 郵件服務(wù)
53: DNS 域名解析系統(tǒng)服務(wù)
80: HTTP 超文本傳輸協(xié)議服務(wù)
135: RPC 遠(yuǎn)程過(guò)程調(diào)用服務(wù)
443: HTTPS
3389: MSRDP 微軟遠(yuǎn)程桌面連接服務(wù)
......
端口掃描都原理,對(duì)于基于 UDP 的服務(wù),發(fā)送對(duì)應(yīng)服務(wù)都請(qǐng)求包,查看是否有應(yīng)答;對(duì)于基于 TCP 的服務(wù),嘗試發(fā)起三次握手發(fā)送 TCP SYN 數(shù)據(jù)包,查看是否有應(yīng)答。
如果遠(yuǎn)端服務(wù)器進(jìn)行了響應(yīng),則表明對(duì)端服務(wù)器上運(yùn)行了對(duì)應(yīng)的服務(wù),接下來(lái)則是進(jìn)一步探知對(duì)端服務(wù)器使用的操作系統(tǒng)、運(yùn)行的服務(wù)器程序類型、版本等等,隨即針對(duì)對(duì)應(yīng)的漏洞程序發(fā)起網(wǎng)絡(luò)攻擊。

由此可見(jiàn),為安全著想,在互聯(lián)網(wǎng)上應(yīng)當(dāng)盡可能少暴露信息,關(guān)閉不需要的服務(wù)端口。
防御手段:使用防火墻等安全產(chǎn)品,即時(shí)發(fā)現(xiàn)和阻斷非法的掃描探測(cè)行為。
重點(diǎn)關(guān)注:運(yùn)維工程師、安全工程師。
系統(tǒng)安全
系統(tǒng)安全版塊中的技術(shù),一般是指攻擊發(fā)生在終端之上,與操作系統(tǒng)息息相關(guān)。
①棧溢出攻擊
棧溢出攻擊歷史悠久,也是發(fā)生在系統(tǒng)側(cè)最基礎(chǔ)的攻擊。
現(xiàn)代計(jì)算機(jī)基本上都是建立在馮-諾伊曼體系之上,而這一體系有一個(gè)最大的問(wèn)題就是數(shù)據(jù)和指令都保存在存儲(chǔ)器中。

在計(jì)算機(jī)的內(nèi)存中,既包含了程序運(yùn)行的所有代碼指令,又包含了程序運(yùn)行的輸入輸出等各種數(shù)據(jù),并沒(méi)有一種強(qiáng)制的機(jī)制將指令和數(shù)據(jù)區(qū)分。
因?yàn)閷?duì)于計(jì)算機(jī)來(lái)說(shuō)它們都是一樣的二進(jìn)制 0 和 1,大部分時(shí)候都是靠程序按照既定的“規(guī)則”去解釋理解內(nèi)存中的這些 0 和 1。而一旦這些“規(guī)則”理解錯(cuò)誤,事情就變得糟糕起來(lái)。
具體到我們現(xiàn)代 CPU 和 OS,不管是 x86/x64 處理器,還是 ARM 處理器,均采用了寄存器+堆棧式的設(shè)計(jì),而這個(gè)堆棧中,既包含了程序運(yùn)行各個(gè)函數(shù)棧幀中的變量數(shù)據(jù)等信息,還保存了函數(shù)調(diào)用產(chǎn)生的返回地址。

所謂棧溢出攻擊,則是通過(guò)一些手段輸入到棧中的緩沖區(qū)中,沖破緩沖區(qū)原有的界限,將存儲(chǔ)返回地址的位置覆蓋為一個(gè)數(shù)值,使其指向攻擊者提前布置的惡意代碼位置,劫持了程序的執(zhí)行流程。
防御手段:現(xiàn)代操作系統(tǒng)針對(duì)棧溢出攻擊已經(jīng)有非常成熟的應(yīng)對(duì)方案,像 Linux 平臺(tái)的 Stack Canary,Windows 平臺(tái)的 GS 機(jī)制等等,程序員需要做的就是充分利用這些機(jī)制。
重點(diǎn)關(guān)注:C/C++ 工程師。
②整數(shù)溢出攻擊
和棧溢出攻擊一樣,整數(shù)溢出攻擊也是屬于溢出類攻擊,不一樣的是溢出的目標(biāo)不是棧中的緩沖區(qū),而是一個(gè)整數(shù)。

我們知道,計(jì)算機(jī)數(shù)值以補(bǔ)碼的方式表示和存儲(chǔ)。在表示一個(gè)有符號(hào)數(shù)時(shí),最高位是用來(lái)表示這是一個(gè)正數(shù)(0)還是一個(gè)負(fù)數(shù)(1)。
比如對(duì)于一個(gè) 16 位的 short 變量而言,+1 和 -1 的表示方法如下:
+1: 0000 0000 0000 0001
-1: 1111 1111 1111 1111
一個(gè) 16 位的 short 變量表示的范圍是 -32768~32767,現(xiàn)在思考一個(gè)問(wèn)題,假如一個(gè) short 變量的值現(xiàn)在是 32767:
32767: 0111 1111 1111 1111
如果現(xiàn)在對(duì)其執(zhí)行 +1 操作,將變成:
1000 0000 0000 0000
而這正是 -32768 的補(bǔ)碼形式!試想一下,如果這個(gè)變量名字叫 length 作為 strcpy 參數(shù),或是叫 index 作為數(shù)組的下標(biāo),整數(shù)的溢出將導(dǎo)致可怕的后果,輕則進(jìn)程崩潰,服務(wù)宕機(jī),重則遠(yuǎn)程代碼執(zhí)行,拿下控制權(quán)。
重點(diǎn)關(guān)注:所有程序員。
③空指針攻擊
空指針一般出現(xiàn)在指針沒(méi)有初始化,或者使用 new 進(jìn)行對(duì)象創(chuàng)建/內(nèi)存分配時(shí)失敗了,而粗心的程序員并沒(méi)有檢查指針是否為空而進(jìn)行訪問(wèn)導(dǎo)致的攻擊。

大多數(shù)情況下,這將導(dǎo)致內(nèi)存地址訪問(wèn)異常,程序會(huì)崩潰退出,造成拒絕服務(wù)的現(xiàn)象。

而在一些特殊的情況下,部分操作系統(tǒng)允許分配內(nèi)存起始地址為 0 的內(nèi)存頁(yè)面,而攻擊者如果提前在該頁(yè)面準(zhǔn)備好攻擊代碼,則可能出現(xiàn)執(zhí)行惡意代碼的風(fēng)險(xiǎn)。
④釋放后使用攻擊
釋放后使用 Use After Free 意為訪問(wèn)一個(gè)已經(jīng)釋放后的內(nèi)存塊。較多的出現(xiàn)在針對(duì)瀏覽器的 Java 引擎的攻擊中。
正常情況下,一個(gè)釋放后的對(duì)象我們是沒(méi)法再訪問(wèn)的,但如果程序員粗心大意,在 delete 對(duì)象后,沒(méi)有即時(shí)對(duì)指針設(shè)置為 NULL,在后續(xù)又繼續(xù)使用該指針訪問(wèn)對(duì)象(比如通過(guò)對(duì)象的虛函數(shù)表指針調(diào)用虛函數(shù)),將出現(xiàn)內(nèi)存訪問(wèn)異常。

在上面的場(chǎng)景中,如果攻擊者在 delete 對(duì)象后,馬上又 new 一個(gè)同樣內(nèi)存大小的對(duì)象,在現(xiàn)代操作系統(tǒng)的堆內(nèi)存管理算法中,會(huì)有很大概率將這個(gè)新的對(duì)象放置于剛剛被 delete 的對(duì)象的位置處。
這個(gè)時(shí)候還通過(guò)原來(lái)對(duì)象的指針去訪問(wèn),將出現(xiàn)鳩占鵲巢,出現(xiàn)可怕的后果。養(yǎng)成好的編程習(xí)慣,對(duì)象 delete 后,指針及時(shí)置空。
重點(diǎn)關(guān)注:C/C++ 工程師。
⑤HOOK
HOOK 原意鉤子的意思,在計(jì)算機(jī)編程中時(shí)常用到,用來(lái)改變?cè)谐绦驁?zhí)行流程。

在那個(gè)互聯(lián)網(wǎng)充斥著流氓軟件的年代,流行著一種鍵盤(pán)記錄器的木馬,用于記錄用戶鍵盤(pán)的輸入,從而盜取密碼,這其中 QQ 曾經(jīng)是重災(zāi)區(qū)。

而實(shí)現(xiàn)這一功能的技術(shù)就是用到了 HOOK 技術(shù),鉤到了鍵盤(pán)敲擊的事件消息。
除了消息 HOOK,用得更多的是程序執(zhí)行流程層面的 HOOK。
惡意代碼被注入目標(biāo)程序后,在函數(shù)入口處添加跳轉(zhuǎn)指令,導(dǎo)致執(zhí)行到此處的線程轉(zhuǎn)而執(zhí)行攻擊者的代碼,實(shí)現(xiàn)修改參數(shù)、過(guò)濾參數(shù)的目的。

HOOK 技術(shù)不僅為黑客使用,安全軟件用的更多,安全軟件需要守護(hù)整個(gè)系統(tǒng)的安全防線,通過(guò) HOOK 技術(shù)在各處敏感 API 處設(shè)立檢查,從而抵御非法調(diào)用攻擊行為。

另外,軟件補(bǔ)丁技術(shù)中也時(shí)常用到 HOOK 技術(shù),軟件廠商發(fā)現(xiàn)原來(lái)程序漏洞后,通過(guò) HOOK,修改既有程序的執(zhí)行邏輯,從而達(dá)到修復(fù)漏洞的目的。
重點(diǎn)關(guān)注:C/C++ 工程師。
⑥權(quán)限提升
現(xiàn)代操作系統(tǒng)都對(duì)運(yùn)行于其中的進(jìn)程、線程提供了權(quán)限管理,因?yàn)榘踩魺o(wú)可避免,而權(quán)限的限制作為一道頗為有效的屏障將程序被攻擊后的影響減少到最小。
換句話說(shuō),即便我們的程序因?yàn)槁┒丛虮还魣?zhí)行了惡意代碼,但因?yàn)椴僮飨到y(tǒng)的權(quán)限控制,惡意代碼能干的事情也有限。

就像一枚硬幣總有兩個(gè)面,有權(quán)限限制,自然而然就有權(quán)限提升。攻擊者想要做更多事情,就得突破操作系統(tǒng)的限制,獲取更高的權(quán)限。
在 Windows 上,經(jīng)常叫獲得管理員權(quán)限。在 Linux 上,經(jīng)常叫獲得 Root 權(quán)限,手機(jī) Root 也是這個(gè)意思。在 iOS 上,經(jīng)常叫“越獄”。

權(quán)限提升的方式五花八門(mén),總體來(lái)說(shuō),程序執(zhí)行的時(shí)候,所屬進(jìn)程/線程擁有一個(gè)安全令牌,用以標(biāo)識(shí)其安全等級(jí),在訪問(wèn)資源和執(zhí)行動(dòng)作的時(shí)候由操作系統(tǒng)內(nèi)核審核。
權(quán)限提升的目標(biāo)就是將這個(gè)安全令牌更改為高等級(jí)的令牌,使其在后續(xù)訪問(wèn)敏感資源和執(zhí)行敏感動(dòng)作時(shí),憑借該令牌可以通過(guò)系統(tǒng)的安全審核。

而更改這個(gè)安全令牌的慣用伎倆便是利用操作系統(tǒng)內(nèi)核漏洞(如前面所述的棧溢出、整數(shù)溢出、釋放后使用等)執(zhí)行攻擊者的代碼,實(shí)現(xiàn)安全令牌的篡改。
重點(diǎn)關(guān)注:安全工程師。
⑦可信計(jì)算
安全攻擊無(wú)處不在,不僅應(yīng)用程序的環(huán)境不可靠,甚至連操作系統(tǒng)內(nèi)核的環(huán)境也充滿了風(fēng)險(xiǎn)。
如果一段程序(比如支付)必須在一個(gè)極度絕密的環(huán)境下執(zhí)行,該怎么辦?

可信計(jì)算的概念被安全研究者提了出來(lái),根據(jù)百科的解釋:
可信計(jì)算/可信用計(jì)算(Trusted Computing,TC)是一項(xiàng)由可信計(jì)算組(可信計(jì)算集群,前稱為 TCPA)推動(dòng)和開(kāi)發(fā)的技術(shù)。可信計(jì)算是在計(jì)算和通信系統(tǒng)中廣泛使用基于硬件安全模塊支持下的可信計(jì)算平臺(tái),以提高系統(tǒng)整體的安全性 [1] 。簽注密鑰是一個(gè) 2048 位的 RSA 公共和私有密鑰對(duì),它在芯片出廠時(shí)隨機(jī)生成并且不能改變。這個(gè)私有密鑰永遠(yuǎn)在芯片里,而公共密鑰用來(lái)認(rèn)證及加密發(fā)送到該芯片的敏感數(shù)據(jù)。
可信計(jì)算中一個(gè)非常重要的概念是可信執(zhí)行環(huán)境 TEE(Trusted Execution Environment),簡(jiǎn)單來(lái)說(shuō)就是在現(xiàn)有的計(jì)算機(jī)內(nèi)部的世界里,再構(gòu)建一個(gè)秘密基地,專門(mén)用于運(yùn)行極度機(jī)密的程序。
該秘密基地甚至連操作系統(tǒng)都輕易無(wú)法訪問(wèn),更別說(shuō)操作系統(tǒng)之上的應(yīng)用程序了。
在移動(dòng)端,ARM 芯片占據(jù)了主流市場(chǎng),ARM 芯片提供了名為 TrustZone 技術(shù)的技術(shù),在硬件層面新增一個(gè)可信計(jì)算環(huán)境,包含一個(gè)可信 OS,和一些可信 APP,和普通環(huán)境在硬件層面隔離,處理器內(nèi)部進(jìn)行通信完成兩個(gè)世界的交互。

重點(diǎn)關(guān)注:終端系統(tǒng)工程師。
密碼學(xué)
由于數(shù)據(jù)傳輸?shù)倪^(guò)程中會(huì)遇到信息泄漏、篡改、偽造的風(fēng)險(xiǎn),加密技術(shù)應(yīng)運(yùn)而生。
①對(duì)稱加密&非對(duì)稱加密
有加密就有解密,根據(jù)加密過(guò)程使用的密鑰和解密過(guò)程使用的密鑰是否相同,將加密算法分為了兩個(gè)大類:對(duì)稱加密和非對(duì)稱加密。
最早出現(xiàn)的加密技術(shù)是對(duì)稱加密:加密密鑰和解密密鑰一致,特點(diǎn)是加密速度快、加密效率高。
常用的對(duì)稱加密算法有:
DES
AES
RC4
這種加密方式中有一個(gè)非常關(guān)鍵的問(wèn)題是,解密方需要拿到密鑰才能進(jìn)行解密,而密鑰鑰匙通過(guò)網(wǎng)絡(luò)傳輸又會(huì)面臨不安全的風(fēng)險(xiǎn),這成了一個(gè)雞生蛋,蛋生雞的問(wèn)題。
于是通信技術(shù)上一個(gè)劃時(shí)代的技術(shù)被發(fā)明了出來(lái),這就是非對(duì)稱加密!

非對(duì)稱加密:加密密鑰與解密密鑰不一致,特點(diǎn)是算法較復(fù)雜,但安全性高。非對(duì)稱加密的密鑰一般分為公鑰和私鑰,公鑰公開(kāi),私鑰需保密。常用于數(shù)字認(rèn)證,如 HTTPS 中握手階段的服務(wù)器認(rèn)證。
常用的非對(duì)稱加密算法有:
RSA
DH
ECC(橢圓曲線加密)
可以毫不夸張的說(shuō),沒(méi)有了非對(duì)稱加密,互聯(lián)網(wǎng)絕不會(huì)發(fā)展到今天這樣的高度。
②秘鑰交換技術(shù)
在互聯(lián)網(wǎng)通信中,有加密就有解密,解密自然就需要密鑰,那如何把這個(gè)密鑰告訴對(duì)方呢?密鑰交換算法就是要解決這個(gè)問(wèn)題:如何安全的將密鑰傳輸給對(duì)方?

回頭看看上面提到的非對(duì)稱加密,它就可以解決這個(gè)問(wèn)題:
服務(wù)器負(fù)責(zé)生成一對(duì)公私鑰,公鑰告訴客戶端,私鑰自己保存
客戶端拿到公鑰后,使用它來(lái)對(duì)后續(xù)通信將要使用的對(duì)稱加密算法密鑰進(jìn)行加密傳輸
服務(wù)端收到后使用私鑰解密,拿到這個(gè)密鑰
以后雙方可以通過(guò)對(duì)稱加密進(jìn)行傳輸通信
上面這個(gè)例子并不只是舉例,在早期版本的 HTTPS 中,就是通過(guò)這種方式來(lái)進(jìn)行密鑰交換。而后來(lái)的版本中,另外一種叫 DH 及其變種的密鑰交換算法用的越來(lái)越多。

DH 全稱 Diffie-Hellman,是兩位數(shù)學(xué)家的名稱構(gòu)成,這種算法的核心是完全依靠數(shù)學(xué)運(yùn)算實(shí)現(xiàn)密鑰的交換。
③信息摘要算法
信息摘要算法其實(shí)不算是一種加密算法,加密的前提是可以通過(guò)解密還原,而信息摘要算法的目的并不是對(duì)數(shù)據(jù)進(jìn)行保護(hù),也無(wú)法解密還原。
在一些語(yǔ)境下,信息摘要我們聽(tīng)得少,聽(tīng)的更多的名詞是哈希,信息摘要算法的目的之一是校驗(yàn)數(shù)據(jù)的正確性,算法公開(kāi),數(shù)據(jù)通過(guò)該算法得出一個(gè)摘要值,收到數(shù)據(jù)后通過(guò)該算法計(jì)算出這個(gè)摘要,前后對(duì)比就知道是否有被篡改。
常用的信息摘要算法有:
MD5
SHA1
SHA256
④數(shù)據(jù)編碼技術(shù)
嚴(yán)格來(lái)說(shuō),數(shù)據(jù)編碼技術(shù)也不算是加密算法,因?yàn)槠淠康耐瑯硬皇菫榱思用?,而只是為了將?shù)據(jù)編碼以便傳輸。

最常見(jiàn)的編碼算法就是 base64 了,多用于編碼二進(jìn)制的數(shù)據(jù),將不可見(jiàn)的字符編碼后轉(zhuǎn)換成 64 個(gè)常見(jiàn)字符組成的文本,便于打印、展示、傳輸、存儲(chǔ)。如郵件 eml 格式中,將附件文件通過(guò) base64 編碼。

除了 base64,還有常用于比特幣錢(qián)包地址編碼的 base58。base 家族還有 base85、base92、base128 等眾多算法。它們的區(qū)別不僅僅在于參與編碼的字符集不同,算法執(zhí)行也是各有千秋。
⑤多因子認(rèn)證技術(shù)
說(shuō)到認(rèn)證,最常出現(xiàn)的莫過(guò)于登錄、支付等場(chǎng)景。傳統(tǒng)的認(rèn)證技術(shù)就是密碼技術(shù),但隨著網(wǎng)絡(luò)攻擊的日益猖獗以及互聯(lián)網(wǎng)滲透到人們生活的方方面面,傳統(tǒng)密碼技術(shù)的安全性不足以滿足互聯(lián)網(wǎng)的發(fā)展。

多因子認(rèn)證技術(shù)意為在傳統(tǒng)密碼認(rèn)證之外,引入其他認(rèn)證技術(shù)進(jìn)行補(bǔ)充,使用 2 種及以上的方式共同完成認(rèn)證。
隨著人工智能技術(shù)的發(fā)展,基于生物特征的認(rèn)證技術(shù)突飛猛進(jìn):
指紋認(rèn)證
虹膜認(rèn)證
......

這個(gè)世界從來(lái)不缺先行者,多因子認(rèn)證看上去很復(fù)雜,好在已經(jīng)有不少頭部企業(yè)搭建了認(rèn)證平臺(tái),對(duì)于絕大多數(shù)企業(yè),需要做的只是下載 SDK,調(diào)用 API 而已。
目前國(guó)內(nèi)外主流的多因子認(rèn)證平臺(tái)有三大派系:
FIDO, 國(guó)際標(biāo)準(zhǔn),在國(guó)內(nèi),翼支付、百度錢(qián)包、京東錢(qián)包、微眾銀行等都已經(jīng)應(yīng)用。
IFAA, 阿里系,憑借阿里在電商領(lǐng)域的優(yōu)勢(shì),也吸引了眾多追隨者。
TUSI, 騰訊系。
總結(jié)
本文羅列了一些常見(jiàn)的信息安全技術(shù),主要分網(wǎng)絡(luò)安全、系統(tǒng)安全和密碼學(xué)三個(gè)領(lǐng)域展開(kāi)。
信息安全技術(shù)不僅僅是安全工程師的事情,作為一位程序員,了解這些技術(shù)將幫助我們更好的 Build The World!
段子歸段子,言歸正傳,對(duì)于咱們程序員來(lái)說(shuō),多多少少了解一些信息安全的技術(shù)知識(shí)還是大有裨益的,不僅能了解一些計(jì)算機(jī)和網(wǎng)絡(luò)的底層原理,也能反哺我們的開(kāi)發(fā)工作,帶著安全思維編程,減少漏洞的產(chǎn)生。
————
另外,對(duì)于編程學(xué)習(xí)的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地
C語(yǔ)言零基礎(chǔ)入門(mén)教程(83集全)
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
編程學(xué)習(xí)書(shū)籍分享:

粉絲編程交流:
