개요
MulVAL은 다중 호스트, 다단계 공격 경로를 모델링할 수 있는 자동 추론 기반 보안 분석 프레임워크입니다. Datalog 언어를 사용해 네트워크 구성, 취약점 정보, 권한 상승 조건 등을 표현하며, 이를 기반으로 XSB 추론 엔진을 통해 공격 그래프를 생성합니다. 본 문서는 Ubuntu 24.04 및 RHEL 환경에서 MulVAL의 설치 및 실전 활용 과정을 정리합니다.
분석 노드 설정 (Ubuntu 24.04)
분석 엔진이 실행될 메인 시스템으로, 다음과 같은 기본 패키지를 설치합니다:
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential gcc make default-jdk flex bison graphviz \
texlive-font-utils xutils-dev libncurses-dev \
libreadline-dev libssl-dev libgmp-dev libx11-dev git
XSB 추론 엔진 설치
MulVAL의 핵심 의존성인 XSB를 소스에서 빌드합니다:
wget https://sourceforge.net/projects/xsb/files/xsb/5.0%20%28Green%20Tea%29/XSB-5.0.tar.gz/download -O XSB-5.0.tar.gz
tar -xzf XSB-5.0.tar.gz
cd XSB/build
./configure --prefix=/usr/local
make && sudo make install
설치 후 심볼릭 링크를 생성하여 실행 경로를 통일합니다:
sudo ln -s /usr/local/XSB-5.0 /usr/local/xsb
MulVAL 소스 가져오기 및 컴파일
GitHub 저장소에서 최신 코드를 복제합니다:
cd ~/Desktop
git clone https://github.com/risksense/mulval.git
환경 변수를 설정합니다:
export XSB_HOME=/usr/local/xsb
export MULVALROOT=/home/$USER/Desktop/mulval
export PATH=$PATH:$XSB_HOME/bin:$MULVALROOT/bin:$MULVALROOT/utils
.bashrc에 위 내용을 추가하고 로드합니다:
echo 'export XSB_HOME=/usr/local/xsb' >> ~/.bashrc
echo 'export MULVALROOT=/home/$USER/Desktop/mulval' >> ~/.bashrc
echo 'export PATH=$PATH:$XSB_HOME/bin:$MULVALROOT/bin:$MULVALROOT/utils' >> ~/.bashrc
source ~/.bashrc
컴파일 오류 해결
Java 버전 충돌 방지를 위해 JDK 17 사용을 권장합니다:
sudo apt install openjdk-17-jdk
필요한 Java 라이브러리를 수동으로 다운로드합니다:
cd $MULVALROOT/lib
wget https://repo1.maven.org/maven2/dom4j/dom4j/1.6.1/dom4j-1.6.1.jar
wget https://repo1.maven.org/maven2/jaxen/jaxen/1.1.1/jaxen-1.1.1.jar
wget https://repo1.maven.org/maven2/com/mysql/mysql-connector-j/8.3.0/mysql-connector-j-8.3.0.jar
C++ 소스 수정
Modern C++ 표준 호환성을 위해 일부 파일을 수정합니다.
$MULVALROOT/src/attack_graph/graphit.l:
/* 변경 전 */
YYSTYPE mylval;
/* 변경 후 */
YYSTYPE *mylval = (YYSTYPE *)&yylval;
$MULVALROOT/src/attack_graph/graphit.y:
/* 변경 전 */
extern graph_data data;
YYSTYPE* mylval = &yylval;
/* 변경 후 */
extern graph_data gdata;
extern YYSTYPE* mylval;
$MULVALROOT/src/attack_graph/attack_graph.cpp 내 반복문 조건 수정:
/* 변경 전 */
for (Fact *fa = c->factList.gethead(); fa > 0; fa = c->factList.getnext())
/* 변경 후 */
for (Fact *fa = c->factList.gethead(); fa != nullptr; fa = c->factList.getnext())
Yacc 출력 파일 이름 충돌 문제 해결:
cd $MULVALROOT/src/attack_graph
cp graphit.tab.c y.tab.cpp
cp graphit.tab.h y.tab.cpp.h
최종 빌드:
cd $MULVALROOT
make clean && make
기능 검증
테스트 케이스를 통해 작동 확인:
mkdir ~/test_mulval && cd ~/test_mulval
cp $MULVALROOT/testcases/3host/input.P .
graph_gen.sh input.P -v
evince AttackGraph.pdf
스캔 노드 설정 (RHEL 8)
실제 대상 시스템에서 취약점을 수집하는 역할을 수행합니다.
sudo dnf update -y
sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y openscap openscap-utils scap-security-guide \
openssl-devel python3 python3-pip wget git
OVAL 기반 스캔 수행
RHEL 공식 OVAL 데이터베이스를 이용해 로컬 시스템을 평가합니다:
mkdir -p /root/scan_results && cd /root/scan_results
wget https://access.redhat.com/security/data/oval/v2/RHEL9/rhel-9.oval.xml.bz2
bunzip2 rhel-9.oval.xml.bz2
oscap oval eval --results results.xml rhel-9.oval.xml
MulVAL 형식으로 변환
MulVAL 제공 스크립트로 결과를 Datalog 입력 형식으로 변환:
$MULVALROOT/bin/oval_adapter.sh results.xml
생성된 host_vulnerabilities.P 파일은 분석 노드로 전송됩니다.
Nessus 연동 (옵션)
Nessus를 사용할 경우 오프라인 플러그인 등록 절차를 거칩니다:
wget [Tenable-offline-plugin-url] -O all-2.0.tar.gz
/opt/nessus/sbin/nessuscli fetch --register-offline [activation-code]
/opt/nessus/sbin/nessuscli update ./all-2.0.tar.gz
systemctl restart nessusd
IP 제한 해제 (Nessus Essentials)
플러그인 피드 날짜를 조작하여 IP 제한을 우회할 수 있습니다:
systemctl stop nessusd
echo 'PLUGIN_SET = "202601041845";' > /opt/nessus/var/nessus/plugin_feed_info.inc
systemctl start nessusd
분석 통합 흐름
- RHEL 노드에서 oscap으로 OVAL 스캔 수행
- 결과 XML → oval_adapter.sh → host_vulnerabilities.P 변환
- SCP로 Ubuntu 분석 노드에 전송
graph_gen.sh으로 공격 그래프 생성- PDF 또는 PostScript 형식으로 시각화
결론
MulVAL은 고전적인 도구이지만, 정형화된 Datalog 기반 분석 접근법 덕분에 여전히 연구 및 사내 보안 감사에 유용합니다. 최신 OS 및 컴파일러 환경에서는 몇 가지 패치가 필요하지만, 전체 파이프라인을 정상화하면 대규모 네트워크의 잠재적 공격 경로를 효과적으로 시각화할 수 있습니다.