목차
XZ Utils
리눅스의 XZ Utils은 XZ 압축 형식을 사용하는 무료 소프트웨어 명령줄(Command Line Interface) 도구 모음으로, 높은 압축 비율을 제공하여 파일 및 패키지의 크기를 효율적으로 줄일 수 있다. 이 도구 세트는 데이터를 압축된 형태로 관리, 배포 및 저장하는 데 필수적이며, 특히 공간 절약이 우선시 되는 리눅스 배포판 소프트웨어 패키징 및 아카이빙과 같은 환경에서 주로 사용된다. XZ Utils의 핵심은 파일을 압축하고 압축을 해제하는 기능을 제공하는 xz
명령이다. 다수의 리눅스 배포판에서 채택함에 따라 xz
는 압축된 파일을 처리하는 표준 도구가 되었으며, 압축 비율과 유연성 측면에서 이전 압축 방법보다 상당한 장점을 제공한다.
기본이 되는 xz
명령어 외에도, XZ Utils은 파일 관리의 다양한 영역으로 유틸리티의 기능을 확장하는 xzdiff
, xzgrep
, xzless
, xzmore
와 같은 추가 명령어를 포함한다. 예를 들어, xzdiff
는 압축을 해제하지 않고도 압축된 파일의 내용을 비교할 수 있게 해주고, xzgrep
은 압축된 파일 내에서 검색을 가능하게 하며, xzless
와 xzmore
는 압축된 텍스트 파일을 페이지별로 볼 수 있는 수단을 제공한다.
이 도구들은 특정 작업을 잘 수행하고 복잡한 워크플로를 수행하기 위해 결합될 수 있는 작고 견고한 도구를 만드는 것을 강조하는 유닉스의 철학에 기반을 두고 있으며, 이러한 접근 방식은 중간 압축 해제 단계 없이 압축된 데이터로 효율적으로 작업할 수 있는 유연성을 사용자에게 보장한다. 그리고, 파일 분석, 데이터 추출, 내용 비교와 같은 작업을 간소화 해서 디스크 공간을 절약할 수 있게 도울 뿐만 아니라, 작업 단순화를 통해 생산성 향상에 도움을 준다.
XZ Utils 는 압축된 파일을 효율적으로 관리 및 처리할 수 있다는 점에서 리눅스 환경에서 중요한 위치를 차지한다. 계속적으로 증가하는 데이터의 양에 발 맞추어 효과적인 압축 솔루션의 필요성 또한 증가하는 것이다. XZ Utils는 이런한 필요를 리눅스 환경의 호환성과 사용의 용이성을 충족시키면서도 강력한 압축 기능을 제공하는 솔루션이다.
Bash Oneliner
다음은 XZ Utils의 버젼 정보를 확인할 수 있는 Bash 원라이너(Oneliner) 스크립트다.
for f in $(find /usr/bin -iname 'xz*' -type f); \
do echo "-------------------------------- $f"; \
strings $f | grep "(XZ Utils) "; \
done
-------------------------------- /usr/bin/xz
xz (XZ Utils) 5.2.5
-------------------------------- /usr/bin/xzdec
xzdec (XZ Utils) 5.2.5
-------------------------------- /usr/bin/xzdiff
version="$prog (XZ Utils) 5.2.5"
-------------------------------- /usr/bin/xzgrep
version="$prog (XZ Utils) 5.2.5"
-------------------------------- /usr/bin/xzless
version='xzless (XZ Utils) 5.2.5'
-------------------------------- /usr/bin/xzmore
version='xzmore (XZ Utils) 5.2.5'
Breakdown
위의 Bash 한 줄 스크립트는 /usr/bin
디렉토리에서 ‘XZ Utils‘와 관련된 바이너리 파일을 검색한 다음 해당 파일에서 버전 정보를 추출해 출력한다. 스크립트를 각 단위로 분해한 뒤, 구성 요소와 기능을 이해해 보자:
for f in $(find /usr/bin -iname 'xz*' -type f);
:for
루프를 시작하여find
명령으로 찾은 각 파일에 대해 반복한다.find /usr/bin
은 Linux에서 실행 파일이 일반적으로 위치하는/usr/bin
디렉토리 내에서 검색할 것을 지정한다.-iname 'xz*'
는 “xz”로 시작하는 파일을 대소문자 구분 없이 찾는다. 이름이 “xz”로 시작하는 XZ Utils 관련 실행 파일을 모두 찾기 위해 사용한다.-type f
는 디렉토리가 아닌 파일만 찾도록 제한한다.find
명령의 결과는for
루프가 반복될 때마다 리스트에 저장되며, 각 항목(파일 경로)은 차례로 변수f
에 할당된다.
do echo "-------------------------------- $f";
:- 각 반복에서 이 명령은 구분선(
--------------------------------
)과 현재f
에 저장된 파일 경로를 출력한다. 검색에서 찾은 파일들을 시각적으로 구분하기 위함.
- 각 반복에서 이 명령은 구분선(
strings $f | grep "(XZ Utils) ";
:strings $f
는f
값의 경로가 가리키는 바이너리 파일에서 인쇄 가능한 문자열을 추출한다. 해당 파일 내에서 문자열만 찾기 위함.strings
의 출력은grep "(XZ Utils) "
로 파이프되며, 여기에서 “(XZ Utils) “를 포함하는 문자열만 필터링한다. 결과적으로 해당 바이너리의 버전 정보를 출력한다.
done
:for
루프의 끝.
위 원라이너 스크립트를 요약하면, 시스템에 설치된 XZ Utils 바이너리의 버전 정보를 찾아 출력한다. 특정 경로 /usr/bin
에 있는 XZ Utils의 실행파일을 찾고, 해당 파일의 경로가 포함된 헤더를 출력한 다음, 파일 내부에서 추출된 버전 정보를 표시한다.
참고자료
위 스크립트는 최근 리눅스 배포판에 포함된 XZ Utils의 리포지토리에서 악의적인 코드가 발견됨에 따라, 취약한 XZ Utils 명령어 존재 여부를 확인하기 위한 배시쉘 원라이너 스크립트다. XZ Utils 소스코드 공격에 관련된 내용은 아래 카스퍼스키에서 공개한 블로그 포스트에서 자세한 내용을 확인할 수 있다.
- Malicious code in Linux distributions
https://www.kaspersky.com/blog/cve-2024-3094-vulnerability-backdoor/50873/
+ There are no comments
Add yours