리눅스/LFS

[LFS8] 파일 및 디렉토리 검사를 위한 Diffutils 빌드

sik13579 2026. 3. 4. 19:00

 안녕하세요 이번 시간에는 Diffutils를 빌드해 보았습니다.

빌드하기 앞서 Diffutils의 역할과 구성에 대해 알아봅시다.

 

1. Diffutils의 역할

 Diffutils(GNU Diffutils)는 파일 간의 차이점을 비교하고 분석하는 도구 모음입니다.

주로 프로그래밍 코드의 변경 사항을 확인하거나 두 문서의 다른 부분을 찾아낼 때 사용합니다.

  • 파일 비교 및 분석 : 두 파일의 내용을 한 줄씩 대조하여 추가, 삭제, 수정된 부분을 식별합니다.
  • 패치(Patch) 생성 : 원본 파일과 수정된 파일의 차이점만 기록한 '패치 파일'을 만들어, 다른 사용자가 해당 변경 사항을 자신의 코드에 쉽게 적용할 수 있습니다.
  • 디렉토리 대조 : 개별 파일뿐만 아니라 두 디렉토리 전체를 비교하여 파일 구성의 차이나 동일한 이름의 파일 내 상세 차이를 보고합니다.
  • 3자 비교(3-way merge) : 두 파일이 공통 조상 파일에서 어떻게 다르게 변했는지 비교하여 병합(Merge)을 돕습니다.

 

2. Diffutils의 주요 명령어

  • diff : 두 파일의 차이점을 출력하는 가장 기본적이고 핵심적인 도구입니다.
  • diff3 : 세 개의 파일(보통 공통 조상 파일과 두 개의 수정본)을 동시에 비교합니다.
  • sdiff : 두 파일을 나란히 배치하여 시각적으로 차이를 비교하고 상호작용하며 병합할 수 있게 합니다.
  • cmp : 두 파일이 내용상 완전히 동일한지 여부를 바이트 단위로 빠르게 확인합니다. 

이 도구들은 리눅스 시스템 관리나 소프트웨어 개발 과정에서 소스 코드의 이력을 추적하는 데 필수적인 역할을 한다고 합니다.

자 그럼 이러한것들을 이용해서 한번 간단한 테스트를 진행해 보았습니다. 

 

2-1. diff를 이용한 차이점 분석

상단 정상적인 보안 설정 파일, 하단 변조된 보안 설정 파일

 

 두 파일이 어떻게 다른지 유니파이드(-u) 형식으로 확인합니다. 가장 가독성이 좋고 패치 파일의 표준인 형식입니다.

diff -u waf_safe.conf waf_hacked.conf

 

 출력 결과 및 해석

diff 명령어로 차이점 분석

  • -  : 원본(safe)에 있었지만 사라진 내용
  • + : 변조된 파일(hacked)에 새로 생긴 내용

이러한 차이점을 분석하여, 누군가 MODE를 DISABLED로 바꾸고 SQL 인젝션 차단을 꺼버렸다 라고 즉시 판단할 수 있게 됩니다.

 

2-2. patch를 이용하여 복구하기

이제 이 차이점을 이용해 '복구 패치'를 만들고 적용해 보겠습니다.

 

 첫 번째로 패치 파일을 생성해 줍니다.

패치 파일 생성

 두 번째로 패치를 적용시킵니다.

패치가 적용된 모습

 세 번째로 결과를 확인해 봅시다.

정상적으로 돌아온 상태

 내용을 확인하면 다시 MODE=ENFORCE와 BLOCK_SQL_INJECTION=YES로 돌아온 것을 볼 수 있습니다!

자 이렇게 해서, diff명령어와, patch명령어를 통해서 Diffutils가 왜 빌드되어야 하는지 알아보았습니다.

다음으로는 빌드를 진행해 보겠습니다.

 

3. Diffutils-3.12 빌드

1. 소스 준비 및 이동

반드시 lfs 유저 상태에서 진행합니다.

cd $LFS/sources
tar -xvf diffutils-3.12.tar.xz  
cd diffutils-3.12

 

2. 설정 (Configure)

크로스 컴파일 환경에 맞춰 경로를 지정합니다.

./configure --prefix=/usr --host=$LFS_TGT --build=$(./build-aux/config.guess)

 

3. 컴파일 및 설치

make
make DESTDIR=$LFS install

 

4. 뒷정리

cd $LFS/sources
rm -rf diffutils-3.11

 

 자 여기까지가 Diffutils 빌드였습니다. 해당 패키지는 이력 추적의 원조입니다.

요즘에 우리가 흔히 쓰는 Git의 git diff나 git log 명령어도 내부적으로는 이 패키지의 논리 구조를 계승하고 있다고 합니다.
정리하자면, 이 논리를 확장한 것이 소스 코드 이력을 관리하는 Git이고, 이 논리를 보안 측면에서 활용해 시스템 설정이나 주요 바이너리의 변조를 감시하는 것이 FIM(파일 무결성 모니터링, File Integrity Monitoring) 기술입니다. 더 나아가 과거의 정상 패턴과 현재의 이질감을 분석하는 이상 탐지(Anomaly Detection)의 기초가 되기도 한다고 합니다.

 

여기까지가 Diffutils빌드였습니다. 오늘은 Diffutils의 diff 명령어와 patch의 명령어를 직접 실습해서 이 패키지가 어떤 역할을 수행하는지 좀 더 깊게 알게 된 거 같습니다.

 

 

 

 

 

-------------------------------------------------오늘의 옵션-------------------------------------------------

u 옵션 : -u (Unified Format)은 diff를 실행할 때 가장 많이 쓰는 옵션입니다.

  • 단순히 "다르다"만 보여주는 게 아니라, 변경된 줄의 앞뒤 문맥(Context)을 같이 보여줍니다.
  • 이 문맥 덕분에 소스 코드의 줄 번호가 조금 바뀌어도 patch 프로그램이 "아, 이 내용 근처를 고쳐야 하는구나"라고 판단할 수 있습니다.