數(shù)據(jù)安全治理關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫(kù)脫敏技術(shù)詳解
數(shù)據(jù)安全治理之API監(jiān)測(cè)系統(tǒng) ,解決API接口安全問(wèn)題【安華金和】
新一代數(shù)據(jù)庫(kù)脫敏技術(shù),為敏感數(shù)據(jù)建立保護(hù)盾!
數(shù)據(jù)庫(kù)脫敏系統(tǒng)與金融行業(yè)案例解讀
數(shù)據(jù)安全治理建設(shè)思路的著力點(diǎn)——數(shù)據(jù)安全咨詢服務(wù)【安華金和】
數(shù)據(jù)庫(kù)防火墻功能有哪些?-數(shù)據(jù)安全-安華金和
數(shù)據(jù)安全關(guān)鍵技術(shù)之?dāng)?shù)據(jù)庫(kù)脫敏技術(shù)詳解【安華金和】
中國(guó)數(shù)據(jù)安全治理落地指導(dǎo)書籍《數(shù)據(jù)安全治理白皮書5.0》正式發(fā)布(附下載)
索引是數(shù)據(jù)庫(kù)優(yōu)化性能的關(guān)鍵技術(shù),同時(shí)也是從9i開(kāi)始(前面未做考證)到現(xiàn)今的12C中,一直存在的安全隱患。索引給數(shù)據(jù)庫(kù)帶來(lái)的安全隱患有多種方式,例如:在PARAMETERS中注入惡意代碼導(dǎo)致的緩沖區(qū)溢出(CVE-2012-0052);通過(guò)SYSTEM.OL$插入觸發(fā)器,任意執(zhí)行SQL語(yǔ)句(CVE-2011-3512);拿到高權(quán)限用戶的表的創(chuàng)建索引權(quán)限,進(jìn)行任意提權(quán)(CVE-2010-0902)等。經(jīng)過(guò)多年發(fā)展,大部分安全漏洞已經(jīng)被徹底封死,但CVE-2010-0902帶來(lái)的提權(quán)思路并未封死,直至今天在12C下,如果條件允許還能死灰復(fù)燃。
要想徹底根除索引權(quán)限帶來(lái)的(CVE-2010-0902)安全隱患,就必須搞清楚三個(gè)問(wèn)題:1.索引可以舍棄嗎? 2.如何利用索引提權(quán)?3. 如何合理配置索引?
大部分情況下,對(duì)于一個(gè)存在著安全隱患的功能來(lái)說(shuō),最穩(wěn)妥的處理方式就是棄之不用。但總有一些功能我們沒(méi)法直接舍棄,只能盡更大的努力去配置,而索引就屬于這樣的一種功能。
索引的價(jià)值在于能夠極大地提高特定數(shù)據(jù)的查詢速度。因?yàn)閿?shù)據(jù)庫(kù)的最基層單位是塊,所有的數(shù)據(jù)在物理磁盤上是以塊的形式存儲(chǔ)的,為確保對(duì)磁盤操作的原子性,訪問(wèn)數(shù)據(jù)就會(huì)一并訪問(wèn)所有數(shù)據(jù)塊。磁盤上的這些數(shù)據(jù)塊與鏈表類似,它們都包含一個(gè)數(shù)據(jù)段和一個(gè)指針,指針指向下一個(gè)節(jié)點(diǎn)(數(shù)據(jù)塊)的內(nèi)存地址,而且它們都不需要連續(xù)存儲(chǔ)(即邏輯上相鄰的數(shù)據(jù)塊在物理上可以相隔很遠(yuǎn))。
當(dāng)我們要查詢某一字段的時(shí)候,如果該值是唯一的,會(huì)使用線性查找,理論上要訪問(wèn)N/2個(gè)數(shù)據(jù)塊,其中N指的是一個(gè)表所涵蓋的所有數(shù)據(jù)塊。如果該字段值不唯一,那么就更麻煩了,要搜索整個(gè)表空間,理論上要訪問(wèn)全部N個(gè)數(shù)據(jù)塊。
然而,如果我們將這些唯一值的字段進(jìn)行排序,就可以使用二分查找,也就是說(shuō)理論上只要訪問(wèn)log2 N個(gè)數(shù)據(jù)塊就可以找到目標(biāo)。同樣,對(duì)不唯一值字段進(jìn)行排序,找到邊緣值,也就不用再搜索表中的其他數(shù)據(jù)塊了。這樣一來(lái),性能也會(huì)有實(shí)質(zhì)性的提升。
而索引完成的正是對(duì)特定字段進(jìn)行排序的工作。最終往往會(huì)以“樹(shù)”的形式存儲(chǔ)。索引唯一明顯缺點(diǎn)就是額外占用磁盤空間。鑒于其突出價(jià)值,索引功能還是要好好保留,做好正確配置,小心使用。
在Oracle對(duì)索引修修補(bǔ)補(bǔ)多個(gè)版本之后,大部分漏洞早已堵上,現(xiàn)在剩余的是利用創(chuàng)建索引權(quán)限進(jìn)行提權(quán)的這類安全隱患。Oracle規(guī)定,只有表的所有者擁有對(duì)該表創(chuàng)建權(quán)限的權(quán)利。其他用戶想在別的用戶表上創(chuàng)建索引可以通過(guò)兩個(gè)途徑:1.簡(jiǎn)單粗暴的系統(tǒng)權(quán)限- Create Any Index,如果一個(gè)用戶具有系統(tǒng)權(quán)限Create Any Index,則該用戶可以對(duì)任意用戶的表創(chuàng)建索引,即便對(duì)那張表沒(méi)有訪問(wèn)權(quán)限);2.細(xì)膩特定的對(duì)象權(quán)限- Create Index,指定某個(gè)用戶對(duì)一張?zhí)囟ǖ谋碛袆?chuàng)建索引的權(quán)限。下面,我們將舉個(gè)例子為大家說(shuō)明如果一個(gè)低權(quán)限用戶擁有SYS用戶某張表的權(quán)限會(huì)發(fā)生什么?
首先創(chuàng)建用戶hacker_user,只給予hacker_user最基本的權(quán)限。
SYS用戶創(chuàng)建一張表test_table,這張表將是hacker_user用來(lái)提權(quán)的關(guān)鍵,向表中插入一條數(shù)據(jù),最后把表的查詢和創(chuàng)建索引的權(quán)限給予低權(quán)限用戶hacker_user。
切到hacker_user用戶,首先建立調(diào)用者權(quán)限函數(shù)GETDBA。GETDBA的核心語(yǔ)句是:EXECUTE IMMEDIATE 'GRANT DBA TO hacker_user'; 這句話是把hacker_user提權(quán)到DBA權(quán)限。接下來(lái)就需要DBA權(quán)限用戶調(diào)用這個(gè)函數(shù)了。由于用戶hacker_user有SYS表test_table的創(chuàng)建索引權(quán)限,于是利用這個(gè)權(quán)限構(gòu)造SYS用戶調(diào)用GETDBA,創(chuàng)建函數(shù)形索引可以利用SYS權(quán)限調(diào)用GETDBA函數(shù),具體如下圖:
注:12C最新版本索引創(chuàng)建會(huì)失敗,提示缺乏INHERIT PRIVILEGES。INHERIT PRIVILEGES默認(rèn)沒(méi)有賦予SYS。在SYS用戶下執(zhí)行GRANT INHERIT PRIVILEGES ON USER SYS TO PUBLIC ;可正常建立。具體內(nèi)容請(qǐng)查閱《ORACLE 12C 安全隱患系列(一)又喜又悲的新功能-INHERIT PRIVILEGES》一文。
創(chuàng)建成功后,執(zhí)行查詢語(yǔ)句,目的是調(diào)用一次索引,使其執(zhí)行,完成整個(gè)提權(quán)過(guò)程。最后查詢DBA用戶發(fā)現(xiàn)hacker_user已經(jīng)被成功提權(quán)。
這種提權(quán)的方式不僅可以針對(duì)SYS用戶,可以針對(duì)任意具有特定權(quán)限的用戶,目標(biāo)往往就是利用這些權(quán)限,進(jìn)行越權(quán)或提權(quán)操作。12C下對(duì)創(chuàng)建的所有用戶默認(rèn)都賦予INHERIT PRIVILEGES,不會(huì)出現(xiàn)類似SYS的情況。這里就不用其他權(quán)限用戶給大家做額外的演示了,過(guò)程都是類似的,針對(duì)不同權(quán)限的用戶修改GETDBA中的語(yǔ)句GRANT DBA TO hacker_user 即可。
Oracle對(duì)索引提權(quán)采用的是治標(biāo)不治本的方式,因此就需要我們的數(shù)據(jù)庫(kù)用戶特別注意,要避免錯(cuò)誤的配置導(dǎo)致不法分子對(duì)數(shù)據(jù)庫(kù)實(shí)施利用索引的提權(quán)攻擊。想要檢查是否存在Index Privilege入侵的隱患,可以切到SYS用戶下進(jìn)行語(yǔ)句查詢:
SELECT OWNER||'.'||TABLE_NAME||':'||GRANTEE FROM DBA_TAB_PRIVS WHERE PRIVILEGE = 'INDEX' AND GRANTEE!=OWNER ORDER BY 1;
此語(yǔ)句可以批量檢查索引權(quán)限的擁有者和創(chuàng)建者是否相同,如果不同,需要進(jìn)一步調(diào)查來(lái)確定是否存在索引注入的可能性。或以高權(quán)限用戶為單位,檢查是否存在高權(quán)限用戶索引被賦予其他用戶的情況存在。
通過(guò)上述查詢,從中很容易發(fā)現(xiàn)用戶HACKER_USER具有test_table的索引權(quán)限,需要對(duì)其進(jìn)行清理。清理請(qǐng)使用語(yǔ)句:REVOKE INDEX ON sys.test_table FROM hacker_user;
請(qǐng)注意,很多應(yīng)用可以在數(shù)據(jù)庫(kù)上創(chuàng)建一些表并修改一些權(quán)限。例如Oracle eBusiness suite的某些版本,在安裝應(yīng)用的時(shí)候把SYS.DUAL的索引權(quán)限賦予了public,直接導(dǎo)致了任意用戶可以利用SYS.DUAL上的索引漏洞執(zhí)行任意SQL語(yǔ)句(CVE-2015-0393)。
Index Privilege的安全問(wèn)題從9i到12c還一直存在,好似一塊甩不掉的狗皮膏藥,屬于典型的便利和安全之間的矛盾。想從兩者之間獲得平衡,Oracle必須從用戶的角度考慮,最大化地提高性能和用戶體驗(yàn)。而涉及安全問(wèn)題,目前就需要以圍魏救趙的方式進(jìn)行封堵,防止索引權(quán)限提權(quán)的出現(xiàn)。因?yàn)檫@種方法無(wú)法從根源上切掉隱患,這就需要Oracle用戶時(shí)刻注意不要把表的索引權(quán)限賦予比創(chuàng)建表權(quán)限低的用戶,要始終繃緊安全這根弦。
試用申請(qǐng)
在線咨詢
咨詢電話
TOP