4.9. Annobin 프로젝트
Annobin 프로젝트는 watermark 사양 프로젝트 구현입니다. 워터마크 사양 프로젝트는 속성을 결정하기 위해 ELF(Extutable and Linkable Format) 개체에 마커를 추가하려고 합니다. Annobin 프로젝트는 annobin 플러그인과
annockó 프로그램으로 구성됩니다
.
annobin
플러그인은 GCC(GNU Compiler Collection) 명령줄, 컴파일 상태 및 컴파일 프로세스를 스캔하고 ELF 노트를 생성합니다. ELF 노트에서는 바이너리가 빌드되는 방식을 기록하고, 보안 강화 검사를 수행하기 위해 annocheck
프로그램에 대한 정보를 제공합니다.
보안 강화 검사기는 annocheck
프로그램의 일부이며 기본적으로 활성화되어 있습니다. 바이너리 파일을 검사하여 필요한 보안 강화 옵션으로 빌드되고 올바르게 컴파일되었는지 여부를 확인합니다. nocheck
는 ELF 개체 파일의 디렉터리, 아카이브 및 RPM 패키지를 반복적으로 스캔할 수 있습니다.
파일은 ELF 형식이어야 합니다. nocheck
는 다른 바이너리 파일 유형을 처리하지 않습니다.
다음 섹션에서는 다음 방법을 설명합니다.
-
annobin
플러그인 사용 -
annocheck
프로그램 사용 -
중복
annobin
노트 제거
4.9.1. annobin 플러그인 사용
다음 섹션에서는 다음 방법을 설명합니다.
-
annobin
플러그인 활성화 -
annobin
플러그인에 옵션 전달
4.9.1.1. annobin 플러그인 활성화
다음 섹션에서는 gcc
및 clang
을 통해 annobin
플러그인을 활성화하는 방법을 설명합니다.
절차
gcc
를 사용하여annobin
플러그인을 활성화하려면 다음을 사용합니다.$ gcc -fplugin=annobin
gcc
가annobin
플러그인을 찾지 못하는 경우 다음을 사용합니다.$ gcc -iplugindir=/path/to/directory/containing/annobin/
/path/to/directory/containing/annobin/ 을
annobin
이 포함된 디렉토리의 절대 경로로 바꿉니다.annobin
플러그인이 포함된 디렉터리를 찾으려면 다음을 사용합니다.$ gcc --print-file-name=plugin
clang
으로annobin
플러그인을 활성화하려면 다음을 사용합니다.$ clang -fplugin=/path/to/directory/containing/annobin/
/path/to/directory/containing/annobin/ 을
annobin
이 포함된 디렉토리의 절대 경로로 바꿉니다.
4.9.1.2. annobin 플러그인에 옵션 전달
다음 섹션에서는 gcc
및 clang
을 통해 옵션을 annobin
플러그인에 전달하는 방법을 설명합니다.
절차
gcc
를 사용하여annobin
플러그인에 옵션을 전달하려면 다음을 사용합니다.$ gcc -fplugin=annobin -fplugin-arg-annobin-option file-name
옵션을
annobin
명령줄 인수로 바꾸고 file-name 을 파일 이름으로 교체합니다.예제
실행 중인 annobin
에 대한 추가 세부 정보를 표시하려면 다음을 사용합니다.$ gcc -fplugin=annobin -fplugin-arg-annobin-verbose file-name
file-name 을 파일 이름으로 바꿉니다.
clang
이 있는annobin
플러그인에 옵션을 전달하려면 다음을 사용합니다.$ clang -fplugin=/path/to/directory/containing/annobin/ -Xclang -plugin-arg-annobin -Xclang option file-name
옵션을
annobin
명령줄 인수로 바꾸고 /path/to/directory/containing/annobin/ 를annobin
이 포함된 디렉터리의 절대 경로로 바꿉니다.예제
실행 중인 annobin
에 대한 추가 세부 정보를 표시하려면 다음을 사용합니다.$ clang -fplugin=/usr/lib64/clang/10/lib/annobin.so -Xclang -plugin-arg-annobin -Xclang verbose file-name
file-name 을 파일 이름으로 바꿉니다.
4.9.2. annocheck 프로그램 사용
다음 섹션에서는 annocheck를
사용하여 검사하는 방법을 설명합니다.
- 파일
- 디렉터리
- RPM 패키지
-
추가 툴
확인
nocheck
재귀적으로 ELF 오브젝트 파일의 디렉터리, 아카이브 및 RPM 패키지를 검사합니다. 파일은 ELF 형식이어야 합니다. nocheck
는 다른 바이너리 파일 유형을 처리하지 않습니다.
4.9.2.1. anocheck를 사용하여 파일 검사
다음 섹션에서는 annocheck
를 사용하여 ELF 파일을 검사하는 방법을 설명합니다.
절차
파일을 검사하려면 다음을 사용합니다.
$ annocheck file-name
file-name 을 파일 이름으로 바꿉니다.
파일은 ELF 형식이어야 합니다. nocheck
는 다른 바이너리 파일 유형을 처리하지 않습니다. annocheck
는 ELF 개체 파일을 포함하는 정적 라이브러리를 처리합니다.
추가 정보
-
annocheck
및 가능한 명령줄 옵션에 대한 자세한 내용은annocheck
도움말 페이지를 참조하십시오.
4.9.2.2. nocheck를 사용하여 디렉토리 검사
다음 섹션에서는 annocheck
를 사용하여 디렉터리에서 ELF 파일을 검사하는 방법을 설명합니다.
절차
디렉터리를 검사하려면 다음을 사용합니다.
$ annocheck directory-name
directory-name 을 디렉터리 이름으로 바꿉니다.
annocheck
는 디렉토리 내용, 하위 디렉터리, 디렉터리 내의 모든 아카이브 및 RPM 패키지를 자동으로 검사합니다.
annocheck
는 ELF 파일만 찾습니다. 다른 파일 유형은 무시됩니다.
추가 정보
-
annocheck
및 가능한 명령줄 옵션에 대한 자세한 내용은annocheck
도움말 페이지를 참조하십시오.
4.9.2.3. nocheck를 사용하여 RPM 패키지 검사
다음 섹션에서는 annocheck
를 사용하여 RPM 패키지에서 ELF 파일을 검사하는 방법을 설명합니다.
절차
RPM 패키지를 검사하려면 다음을 사용합니다.
$ annocheck rpm-package-name
rpm-package-name 을 RPM 패키지 이름으로 교체합니다. no
check는
RPM 패키지에 있는 모든 ELF 파일을 반복적으로 검사합니다.
annocheck
는 ELF 파일만 찾습니다. 다른 파일 유형은 무시됩니다.
제공된 디버그 정보 RPM으로 RPM 패키지를 스캔하려면 다음을 사용합니다.
$ annocheck rpm-package-name --debug-rpm debuginfo-rpm
rpm-package-name 을 RPM 패키지 이름으로 바꾸고 debuginfo-rpm 을 바이너리 RPM과 연결된 디버그 정보 RPM의 이름으로 교체합니다.
추가 정보
-
annocheck
및 가능한 명령줄 옵션에 대한 자세한 내용은annocheck
도움말 페이지를 참조하십시오.
4.9.2.4. 추가 툴 확인 사용
annocheck
에는 바이너리 파일을 검사하기 위한 여러 도구가 포함되어 있습니다. 이러한 툴은 명령줄 옵션을 사용하여 활성화할 수 있습니다.
다음 섹션에서는 다음을 활성화하는 방법을 설명합니다.
-
기본 제공
도구 -
참고
도구 -
section-size
툴
여러 도구를 동시에 활성화할 수 있습니다.
강화 검사기는 기본적으로 활성화되어 있습니다.
4.9.2.4.1. 기본 제공 도구
활성화
annocheck
built-by
툴을 사용하여 바이너리 파일을 빌드한 컴파일러의 이름을 찾을 수 있습니다.
절차
내장된 툴
을 활성화하려면 다음을 사용합니다.$ annocheck --enable-built-by
추가 정보
-
기본 제공 도구에
대한 자세한 내용은--help
명령줄 옵션을 참조하십시오.
4.9.2.4.2. 노트
도구 활성화
annocheck
플러그인에서 만든 바이너리 파일 내에 저장된 메모를 표시할 수 있습니다.
노트
도구를 사용하여 anno
bin
절차
노트
도구를 사용하려면 다음을 사용하십시오.$ annocheck --enable-notes
노트는 주소 범위별로 정렬된 시퀀스에 표시됩니다.
추가 정보
-
노트
도구에 대한 자세한 내용은--help
명령줄 옵션을 참조하십시오.
4.9.2.4.3. section-size
도구 활성화
annocheck
섹션-size
도구를 사용하면 명명된 섹션의 크기가 표시됩니다.
절차
section-size
도구를 활성화하려면 다음을 사용합니다.$ annocheck --section-size=name
name 을 named 섹션의 이름으로 바꿉니다. 출력은 특정 섹션으로 제한됩니다. 누적 결과가 마지막에 생성됩니다.
추가 정보
-
section-size
도구에 대한 자세한 내용은--help
명령줄 옵션을 참조하십시오.
4.9.2.4.4. 검사기 기본 강화
강화 검사기는 기본적으로 활성화되어 있습니다. --disable-hardened
명령줄 옵션을 사용하여 강화 검사기를 비활성화할 수 있습니다.
4.9.2.4.4.1. 강화 검사기 옵션
annocheck
프로그램은 다음 옵션을 확인합니다.
-
-z now
linker 옵션을 사용하여 지연 바인딩이 비활성화됩니다. - 프로그램에는 실행 가능한 메모리 영역에 스택이 없습니다.
- GOT 테이블에 대한 재배치는 읽기 전용으로 설정됩니다.
- 프로그램 세그먼트에는 읽기, 쓰기 및 실행 권한 비트가 모두 설정되어 있지 않습니다.
- 실행 중인 코드에 대한 재배치가 없습니다.
- 런타임 시 공유 라이브러리를 찾기 위한 runpath 정보에는 /usr에 루트인 디렉토리만 포함됩니다.
-
이 프로그램은
annobin
메모가 활성화된 상태로 컴파일되었습니다. -
이 프로그램은
-fstack-protector-strong
옵션을 활성화하여 컴파일했습니다. -
프로그램은
-D_FORTIFY_SOURCE=2
로 컴파일되었습니다. -
프로그램은
-D_GLIBCXX_ASSERTIONS
로 컴파일되었습니다. -
프로그램은
-fexceptions가 활성화된 상태로 컴파일
되었습니다. -
프로그램은
-fstack-clash-protection
이 활성화된 상태로 컴파일되었습니다. -
프로그램은
-O2
이상에서 컴파일되었습니다. - 프로그램에는 쓰기 가능한 위치에 있는 재배치가 없습니다.
- 동적 실행 파일에는 동적 세그먼트가 있습니다.
-
공유 라이브러리는
-fPIC 또는
로 컴파일되었습니다.-f
PIE -
동적 실행 파일은
-fPIE
로 컴파일되고-pie
와 연결되었습니다. -
사용 가능한 경우
-fcf-protection=full
옵션이 사용되었습니다. -
사용 가능한 경우
-mbranch-protection
옵션이 사용되었습니다. -
사용 가능한 경우
-mstackrealign
옵션이 사용되었습니다.
4.9.2.4.4.2. 강화 검사기 비활성화
다음 섹션에서는 강화 검사기를 비활성화하는 방법을 설명합니다.
절차
강화 검사기 없이 파일의 메모를 스캔하려면 다음을 사용합니다.
$ annocheck --enable-notes --disable-hardened file-name
file-name 을 파일 이름으로 바꿉니다.
4.9.3. 중복 annobin 노트 제거
annobin
을 사용하면 바이너리 크기가 증가합니다. annobin
으로 컴파일된 바이너리의 크기를 줄이기 위해 중복 annobin
노트를 제거하면 됩니다. 중복 annobin
노트를 제거하려면 binutils
패키지의 일부인 objcopy
프로그램을 사용합니다.
절차
중복된
annobin
노트를 제거하려면 다음을 사용합니다.$ objcopy --merge-notes file-name
file-name 을 파일 이름으로 바꿉니다.
4.9.4. GCC Toolset 12의 annobin 관련 세부 사항
GCC Toolset 12의 annobin
과 gcc
간의 동기화 문제로 인해 다음과 유사한 오류 메시지와 함께 컴파일이 실패할 수 있습니다.
cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin/gcc-annobin.so
expanded from short plugin name gcc-annobin: No such file or directory
이 문제를 해결하려면 annobin.so
파일에서 gcc-annobin.so
파일로 플러그인 디렉토리에 심볼릭 링크를 만듭니다.
# cd /opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin
# ln -s annobin.so gcc-annobin.so
아키텍처 를 시스템에서 사용하는 아키텍처로 교체합니다.
-
aarch64
-
i686
-
ppc64le
-
s390x
-
x86_64