隨著信息化的推進,信息系統的安全問題成為了世界各國都十分關心的問題。我國則推出了GB/T 22239-2008《信息安全技術信息系統安全等級保護基本要求》(以下簡稱《基本要求》)來對信息系統進行保護。
《基本要求》在定級為三級及以上的信息系統中提出了“剩餘信息保護”的要求。
剩餘信息保護的定義,1.1 《基本要求》對於要求項的劃分,1.2 剩餘信息保護安全項的定義,套用系統剩餘信息保護的技術實現,2.1 記憶體中的剩餘信息保護,2.2 硬碟中的剩餘信息保護,套用系統剩餘信息保護的檢測方法簡介,總結和討論,
剩餘信息保護的定義
在介紹《基本要求》中對於剩餘信息保護要求項的定義前,先要簡單介紹一下一些背景知識。
1.1 《基本要求》對於要求項的劃分
從整體上,《基本要求》為技術要求和管理要求兩大類。其中,技術要求按其保護的側重點的不同被劃分為以下三類:
1)業務信息安全類(S類):主要關注的是保護數據在存儲、傳輸、處理過程中不被泄露、破壞和免受未授權的修改。
2)系統服務安全類(A類):關注的是保護系統連續正常的原型,避免因對系統未授權修改、破壞而導致系統不可用。
3)通用安全保護類(G類):既關注保護業務信息的安全性,同時也關注保護系統的連續可用性。
《基本要求》中的所有的要求項都被分為上述三類,剩餘信息保護要求項是在三級以上系統中才出現的,是屬於S類的,一般被分為S3(適用於三級系統)或者是S4(適用於四級系統)。
此外,技術要求還被劃分為物理層面安全要求、網路層面安全要求、主機層面安全要求(簡稱“主機安全”)、套用層面安全要求(簡稱“套用安全”)以及數據和備份恢復層面安全要求。剩餘信息保護要求項是出現在主機安全和套用安全方面的。
1.2 剩餘信息保護安全項的定義
在主機安全方面,剩餘信息保護安全項(S3或S4)的要求包括:
1)應保證作業系統和資料庫系統用戶的鑑別信息所在的存儲空間,被釋放或再分配給其他用戶前得到完全清除,無論這些信息是存放在硬碟上還是在記憶體中;
2)應確保系統內的檔案、目錄和資料庫記錄等資源所在的存儲空間,被釋放或重新分配給其他用戶前得到完全清除。
在套用安全方面,剩餘信息保護安全項(S3或S4)的要求包括:
1)應保證用戶鑑別信息所在的存儲空間被釋放或再分配給其他用戶前得到完全清除,無論這些信息是存放在硬碟上還是在記憶體中;
2)應保證系統內的檔案、目錄和資料庫記錄等資源所在的存儲空間被釋放或重新分配給其他用戶前得到完全清除。
套用系統剩餘信息保護的技術實現
從《基本要求》對於剩餘信息保護要求項的描述來看,該要求項要保護的客體(也即對象)——“剩餘信息”主要是記憶體或者硬碟的存儲空間,要保護的時間是被釋放或重新分配給其他用戶後。
2.1 記憶體中的剩餘信息保護
記憶體中剩餘信息保護的重點是:在釋放記憶體前,將記憶體中存儲的信息刪除,也即將記憶體清空或者寫入隨機的無關信息。下面以應用程式對用戶的身份鑑別流程(參見圖1)為例,介紹一下如何對記憶體中的剩餘信息進行保護。假設用戶甲在登錄應用程式A的時候,輸入了用戶名和密碼。一般情況下,應用程式A會先將用戶輸入的用戶名和密碼存儲在兩個字元串類型(也可能是數組等)變數中。通常情況下,為了防止攻擊者採用自動腳本對應用程式進行攻擊,套用系統會要求用戶輸入校驗碼,並優先對校驗碼進行驗證。如果用戶輸入的校驗碼錯誤,套用系統應要求用戶重新輸入校驗碼。在校驗碼驗證通過後,套用系統應從資料庫中讀取用戶身份信息表,並在其中查找是否存在用戶輸入的用戶名。如果未查找到,則套用系統應返回“用戶名不存在”(或者較模糊地返回“用戶名不存在或者密碼錯誤”)。如果在用戶身份信息表中找到用戶名,應用程式一般應採用一種哈希(hash)算法(通常是MD5算法)對用戶輸入的密碼進行運算得到其哈希值,並與資料庫用戶身份信息表中存儲的密碼哈希值進行比較。這裡需要說明的是,資料庫中一般不明文存儲用戶的密碼,而是存儲密碼的MD5值。
圖1 應用程式對其用戶的身份鑑別流程圖
通常情況下,套用系統在使用完記憶體中信息後,是不會對其使用過的記憶體進行清理的。這些存儲著信息的記憶體在程式的身份認證函式(或者方法)退出後,仍然存儲在記憶體中,如果攻擊者對記憶體進行掃描就會得到存儲在其中的信息。為了達到對剩餘信息進行保護的目的,需要身份認證函式在使用完用戶名和密碼信息後,對曾經存儲過這些信息的記憶體空間進行重新的寫入操作,將無關(或者垃圾)信息寫入該記憶體空間,也可以對該記憶體空間進行清零操作。下面以C語言為例,對存儲過用戶名和密碼的數組進行清零操作。
void IsCorrectUser ()
{
char* pcUserName = NULL;
char* pcPassword = NULL;
pcUserName = (char*) malloc(128 * sizeof(char));
pcPassword = (char*) malloc(128 * sizeof(char));
GetUserNameAndPassword(pcUserName, pcPassword);
CheckUserNameAndPassword(pcUserName, pcPassword);
int i = 0;
for (i = 0; i < 128; i++)
{
*( pcUserName + i) = 0;
*( pcPassword + i) = 0;
}
free(pcUserName);
pcUserName = NULL;
free(pcPassword);
pcPassword = NULL;
return;
}
函式IsCorrectUser採用malloc函式為存儲用戶名和密碼分別動態申請了128位元組的記憶體。在使用後,對記憶體進行了清空和釋放的操作,這樣就能夠保證對剩餘信息的保護。此外,需要說明的是在GetUserNameAndPassword和CheckUserNameAndPassword函式中也要同樣對存儲過用戶名和密碼的記憶體進行使用後清空操作,才能夠完成對剩餘信息的保護工作。
2.2 硬碟中的剩餘信息保護
硬碟中剩餘信息保護的重點是:在刪除檔案前,將對檔案中存儲的信息進行刪除,也即將檔案的存儲空間清空或者寫入隨機的無關信息。下面以應用程式對一個檔案的刪除為例,介紹一下如何對硬碟中的剩餘信息進行保護。通常應用程式在刪除檔案的時候,僅僅是調用刪除函式,判斷刪除函式的返回值是否正常。
void DeleteFile (char* pcFilePath)
{
long lCurrentPosition = 0;
FILE* fpFilePointer = NULL;
int iCounter = 0;
char cTempChar = '0';
fpFilePointer = fopen(pcFilePath, "r+");
if(NULL == fpFilePointer)
{
printf("\nfail to open file %s", pcFilePath) ;
}
while ( 0 == feof(fpFilePointer) )
{
lCurrentPosition = ftell(fpFilePointer);
cTempChar = fgetc(fpFilePointer);
if (EOF == cTempChar)
{
break;
}
GetRandomCharacter(&cTempChar);
fseek(fpFilePointer, lCurrentPosition, SEEK_SET);
fputc(cTempChar, fpFilePointer);
lCurrentPosition = lCurrentPosition + 1;
fseek(fpFilePointer, lCurrentPosition, SEEK_SET);
}
fclose(fpFilePointer);
fpFilePointer = NULL;
if ( 0 != remove(pcFilePath) )
{
刪除檔案失敗,列印錯誤信息
printf("\nfail to remove file %s", pcFilePath) ;
}
return;
}
在函式DeleteFile中,函式每從檔案中讀出一個字元就調用GetRandomCharacter函式對該字元進行了操作,並將進行操作後的字元寫回檔案中。這樣就能夠保證要被刪除的檔案中的內容也經過處理了。而處理的方法可以是將檔案中的內容都設定成零,也可以是對原有信息進行操作。本文也以C語言為例,給出了如下兩種實現方式。
void GetRandomCharacter (char* pcChar)
{
int iOperator = 0;
int iOperand = 0;
randomize();
iOperator = random (4);
iOperand = random (128);
switch(iOperator)
{
case 1:
{
*pcChar = *pcChar + iOperand;
break;
}
case 2:
{
*pcChar = *pcChar - iOperand;
break;
}
case 3:
{
*pcChar = *pcChar * iOperand;
break;
}
default:
{
*pcChar = iOperand;
break;
}
}
return;
}
套用系統剩餘信息保護的檢測方法簡介
在套用系統剩餘信息保護的檢測方面,主要從訪談、檢查和測試三部分分別描述。
1)訪談
詢問套用系統開發人員,是否對套用系統中的剩餘信息進行了保護。如果開發人員連剩餘信息保護的概念都不清楚,那么也就不可能對剩餘信息進行保護。
2)檢查
查看原始碼,看在記憶體釋放或者刪除檔案前,套用系統是否進行了處理。檢查套用系統操作手冊中是否有相關的描述。
3)測試
為了確認記憶體中是否有剩餘信息,可以在採用記憶體掃描軟體(或者記憶體監視軟體)進行掃描。對於存儲在磁碟中的檔案,可以嘗試在套用系統刪除檔案後,用恢復軟體恢復檔案,並對比恢復檔案和原檔案。
總結和討論
本文主要針對等保套用安全對剩餘信息保護的技術實現和檢測做了介紹。對於通用作業系統來說,考慮到系統的運行效率,沒有在系統核心層面默認實現剩餘信息保護功能,只能通過第三方工具來實現。
對剩餘信息的清除是會對套用系統的性能造成影響的。相對於寫入垃圾數據的方式,清空存儲區或者檔案的方式對性能的影響更小。
存儲著剩餘信息的記憶體空間或者磁碟檔案就像是曾經記錄過重要信息的紙或者光碟一樣,不能隨意丟棄。在現實世界中,我們知道要把存儲過重要信息的紙或者光碟銷毀。在電腦中也是一樣的,在把記憶體空間或者磁碟空間分配給其他的用戶使用前,需要把我們曾經存儲在裡面的信息銷毀。
本文中給出的算法都是採用標準的C語言實現,希望能對用其它語言編程的用戶有所啟示。