iT邦幫忙

2023 iThome 鐵人賽

DAY 6
0

Yes

  • 今天要介紹的逃逸手法是透過 cgroups 的機制來觸發達到目的,但在使用該機制前我們來先了解一下 cgroups 大概是幹嘛的。

  • cgroups 是可以針對將多個Process組成集合,並且以這些集合為單位,限制該集合中夠使用的總資源上限,藉此避免需被隔離的Process使用系統過多的資源。cgroups 也有可以限制資源的類型,包含了cpu、cpuacct、cpuset、memory、devices、freezer、net_cls、blkio、perf_event、net_prio、hugetlb、pids、rdma。

  • 這邊就以最直覺的 cpu 做為測試範例,參考使用 cgroups-v1 为应用程序设置 CPU 限制。 先參考 Day19 - 當容器逃逸的生活遇到瓶頸時,知道該怎麼做嗎?繼續用 unshare 就對了。 將 cgroups 版本切換到 v1。

  • 先新增一個無窮迴圈的檔案,並且執行它。

cat << EOF > loop.c 
int main(void) {
    int i=0 ;
    for( ; ; ) i++ ;
    return 0;
}
EOF
sudo apt update && sudo apt install -y gcc ;
gcc loop.c ;
./a.out ;

#開另個 Terminal 看一下 CPU 使用量,不出意外有顆 CPU 的使用率會特別高
htop ; 
  • cgroup 可以新增群組並且設定資源的使用限制,再針對特定的 process ID 加入群組達到效果,實作部分參考如下 :
# 確認是否已掛載了 cgroups 控制器
mount -l | grep cgroup ; 
sudo mkdir -p /sys/fs/cgroup/cpu/my_limit/ ;

# 發現只是建個資料夾產生一大堆檔案
ll /sys/fs/cgroup/cpu/my_limit/ ; 

#這邊要用 root 權限做
echo "1000000" > /sys/fs/cgroup/cpu/my_limit/cpu.cfs_period_us ;
echo "200000" > /sys/fs/cgroup/cpu/my_limit/cpu.cfs_quota_us ;

#執行 ./a.out 程式,才會有 pid
./a.out ;

#查一下 a.out 的 pid 是多少
ps aux | grep a.out | grep -v grep ; 

#把這個 pid 加到 cgroup 的群組裡面
echo "pid" > /sys/fs/cgroup/cpu/my_limit/cgroup.procs ;

# 觀察一下 CPU 使用量,大概會坐落在 20% 左右
htop ;
  • 比較難的部分設定 cfs_period_us、cfs_quota_us 的地方,參考3.2. cpu 的說明如下。

  • cpu.cfs_period_us

    • specifies a period of time in microseconds (µs, represented here as "us") for how regularly a cgroup's access to CPU resources should be reallocated. If tasks in a cgroup should be able to access a single CPU for 0.2 seconds out of every 1 second, set cpu.cfs_quota_us to 200000 and cpu.cfs_period_us to 1000000. The upper limit of the cpu.cfs_quota_us parameter is 1 second and the lower limit is 1000 microseconds.
    • 意思就是設定 cgroups 要在 cpu.cfs_period_us 時間內存取CPU cpu.cfs_quota_us 秒
  • 大概知道 cgroups 的作用之後,cgroups 逃逸手法部分就參考 Day19 - 當容器逃逸的生活遇到瓶頸時,知道該怎麼做嗎?繼續用 unshare 就對了。

  • 參考資料 :

  • 今日總結 :

    • 本日回顧 :
      • 以前都只是用嘴巴說說 cgroups 是用來限制 process的資源,剛好趁著這次鐵人賽找些資源來做一些例子上的演示。雖然後續會發現知道這些對 cgroups 逃逸好像沒甚麼幫助,但學東西就是這樣,有時候我也不知道現在學這個可以幹嘛,以後有一天跟妹子約會的時候就派上用場了也說不定(幹話)。/images/emoticon/emoticon24.gif
    • 次日預告 :
      • 接下來會更限縮容器的權限,讓它只剩下安裝驅動程式(SYS_MODULE)的權限,這次要透過安裝自己寫好的驅動程式做逃逸。所以假如你之前沒寫過 Linux 驅動程式的各位,明天就是第一次寫 Driver 做壞事的時候了。/images/emoticon/emoticon39.gif

上一篇
Day05 - 作業2解答 - CentOS 7 特權容器掛載根目錄
下一篇
Day07 - (攻擊) 容器逃逸手法 - linux module
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言