4.4. Annobin 프로젝트
Annobin 프로젝트는 Watermark 사양 프로젝트의 구현입니다. 워터마크 사양 프로젝트는 속성을 결정하기 위해 Executable 및 Linkable Format (ELF) 오브젝트에 마커를 추가하려고 합니다. Annobin 프로젝트는 annobin 플러그인과 annock Cryostat 프로그램으로 구성됩니다.
annobin 플러그인은 GNU 컴파일러 컬렉션(GCC) 명령줄, 컴파일 상태 및 컴파일 프로세스를 스캔하고 ELF 노트를 생성합니다. ELF 노트는 바이너리가 빌드된 방법을 기록하고 보안 강화 검사를 수행하기 위한 annocheck 프로그램에 대한 정보를 제공합니다.
보안 강화 검사기는 annocheck 프로그램의 일부이며 기본적으로 활성화되어 있습니다. 바이너리 파일을 확인하여 프로그램이 필요한 보안 강화 옵션으로 빌드되었는지 여부를 확인하고 올바르게 컴파일되었는지 확인합니다. annocheck 는 ELF 오브젝트 파일의 디렉토리, 아카이브 및 RPM 패키지를 재귀적으로 검사할 수 있습니다.
파일은 ELF 형식이어야 합니다. annocheck 는 다른 바이너리 파일 유형을 처리하지 않습니다.
다음 섹션에서는 다음을 수행하는 방법을 설명합니다.
-
annobin플러그인 사용 -
annocheck프로그램 사용 -
중복
annobin노트 제거
4.4.1. annobin 플러그인 사용 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 다음을 수행하는 방법을 설명합니다.
-
annobin플러그인 활성화 -
annobin플러그인에 옵션을 전달
4.4.1.1. annobin 플러그인 활성화 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 gcc 및 clang 을 통해 annobin 플러그인을 활성화하는 방법을 설명합니다.
프로세스
gcc로annobin플러그인을 활성화하려면 다음을 사용합니다.$ gcc -fplugin=annobingcc가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.4.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-namefile-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-namefile-name 을 파일 이름으로 교체합니다.
4.4.2. annocheck 프로그램 사용 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 annocheck 를 사용하여 검사하는 방법을 설명합니다.
- 파일
- 디렉터리
- RPM 패키지
-
annocheck추가 도구
ELF 오브젝트 파일의 디렉토리, 아카이브 및 RPM 패키지를 재귀적으로 검사합니다. 파일은 ELF 형식이어야 합니다. annocheck 는 다른 바이너리 파일 유형을 처리하지 않습니다.
4.4.2.1. annocheck를 사용하여 파일 검사 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 nocheck를 사용하여 ELF 파일을 검사하는 방법을 설명합니다.
프로세스
파일을 검사하려면 다음을 사용합니다.
$ annocheck file-namefile-name 을 파일 이름으로 교체합니다.
참고파일은 ELF 형식이어야 합니다.
annocheck는 다른 바이너리 파일 유형을 처리하지 않습니다.annocheck는 ELF 오브젝트 파일이 포함된 정적 라이브러리를 처리합니다.
4.4.2.2. annocheck를 사용하여 디렉토리 검사 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 nocheck 를 사용하여 디렉터리에서 ELF 파일을 검사하는 방법을 설명합니다.
프로세스
디렉터리를 스캔하려면 다음을 사용합니다.
$ annocheck directory-namedirectory-name 을 디렉터리 이름으로 교체합니다.
annocheck는 디렉터리의 콘텐츠, 하위 디렉터리 및 디렉터리 내의 모든 아카이브 및 RPM 패키지를 자동으로 검사합니다.참고annocheck는 ELF 파일만 찾습니다. 다른 파일 유형은 무시됩니다.
4.4.2.3. annocheck를 사용하여 RPM 패키지 검사 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 nocheck 를 사용하여 RPM 패키지에서 ELF 파일을 검사하는 방법을 설명합니다.
프로세스
RPM 패키지를 스캔하려면 다음을 사용합니다.
$ annocheck rpm-package-namerpm-package-name 을 RPM 패키지 이름으로 교체합니다.
annocheck는 RPM 패키지 내의 모든 ELF 파일을 재귀적으로 검사합니다.참고annocheck는 ELF 파일만 찾습니다. 다른 파일 유형은 무시됩니다.제공된 debug info RPM으로 RPM 패키지를 스캔하려면 다음을 사용합니다.
$ annocheck rpm-package-name --debug-rpm debuginfo-rpmrpm-package-name 을 RPM 패키지 이름으로 바꾸고 debuginfo-rpm 을 바이너리 RPM과 연결된 디버그 정보 RPM 이름으로 교체합니다.
4.4.2.4. annocheck 추가 툴 사용 링크 복사링크가 클립보드에 복사되었습니다!
annocheck 에는 바이너리 파일을 검사하는 데 필요한 여러 툴이 포함되어 있습니다. 명령줄 옵션을 사용하여 이러한 도구를 활성화할 수 있습니다.
다음 섹션에서는 다음을 활성화하는 방법을 설명합니다.
-
내장도구 -
참고도구 -
섹션 크기도구
여러 툴을 동시에 활성화할 수 있습니다.
강화 검사기는 기본적으로 활성화되어 있습니다.
4.4.2.4.1. 내장 툴 활성화 링크 복사링크가 클립보드에 복사되었습니다!
annocheck 내장 툴을 사용하여 바이너리 파일을 빌드한 컴파일러의 이름을 찾을 수 있습니다.
프로세스
내장 툴을활성화하려면 다음을 사용합니다.$ annocheck --enable-built-by기본툴에 대한 자세한 내용은--help명령줄 옵션을 참조하십시오.
4.4.2.4.2. 노트 도구 활성화 링크 복사링크가 클립보드에 복사되었습니다!
annocheck 노트 도구를 사용하여 annobin 플러그인에서 생성한 바이너리 파일 내에 저장된 노트를 표시할 수 있습니다.
프로세스
노트도구를 활성화하려면 다음을 사용합니다.$ annocheck --enable-notes노트는 주소 범위별로 정렬된 순서로 표시됩니다.
노트도구에 대한 자세한 내용은--help명령줄 옵션을 참조하십시오.
4.4.2.4.3. section-size 툴 활성화 링크 복사링크가 클립보드에 복사되었습니다!
annocheck 섹션 크기 툴을 사용하여 이름이 지정된 섹션의 크기를 표시할 수 있습니다.
프로세스
section-size툴을 활성화하려면 다음을 사용합니다.$ annocheck --section-size=namename 을 named 섹션의 이름으로 바꿉니다. 출력은 특정 섹션으로 제한됩니다. 결국 누적 결과가 생성됩니다.
섹션 크기도구에 대한 자세한 내용은--help명령줄 옵션을 참조하십시오.
4.4.2.4.4. 강화 검사 기본 사항 링크 복사링크가 클립보드에 복사되었습니다!
강화 검사기는 기본적으로 활성화되어 있습니다. --disable-hardened 명령줄 옵션을 사용하여 강화 검사기를 비활성화할 수 있습니다.
4.4.2.4.4.1. 강화 검사 옵션 링크 복사링크가 클립보드에 복사되었습니다!
annocheck 프로그램은 다음 옵션을 확인합니다.
-
이제 -z링커 옵션을 사용하여 lazy 바인딩이 비활성화됩니다. - 프로그램은 실행 가능한 메모리 영역에 스택이 없습니다.
- GOT 테이블의 재배치는 읽기 전용으로 설정됩니다.
- 프로그램 세그먼트에는 읽기, 쓰기 및 실행 권한 비트 세트가 3개 모두 없습니다.
- 실행 가능한 코드에 대한 재배치는 없습니다.
- 런타임에 공유 라이브러리를 찾는 runpath 정보에는 /usr에서 root로 지정된 디렉터리만 포함됩니다.
-
이 프로그램은
annobin노트를 사용하여 컴파일되었습니다. -
프로그램은
-fstack-protector-strong옵션을 활성화하여 컴파일되었습니다. -
이 프로그램은
-D_FORTIFY_SOURCE=2로 컴파일되었습니다. -
이 프로그램은
-D_GLIBCXX_ASSERTIONS로 컴파일되었습니다. -
프로그램은
-fexceptions가 활성화된 상태로 컴파일되었습니다. -
이 프로그램은
-fstack-clash-protection을 활성화하여 컴파일되었습니다. -
이 프로그램은
-O2이상에서 컴파일되었습니다. - 이 프로그램에는 쓰기 가능한 재할당이 없습니다.
- 동적 실행 파일에는 동적 세그먼트가 있습니다.
-
공유 라이브러리는
-fPIC또는-fPIE로 컴파일되었습니다. -
동적 실행 파일은
-fPIE로 컴파일되고-pie와 연결되어 있습니다. -
사용 가능한 경우
-fcf-protection=full옵션이 사용되었습니다. -
사용 가능한 경우
-mbranch-protection옵션이 사용됩니다. -
사용 가능한 경우
-mstackrealign옵션이 사용됩니다.
4.4.2.4.4.2. 강화 검사기 비활성화 링크 복사링크가 클립보드에 복사되었습니다!
다음 섹션에서는 강화 검사기를 비활성화하는 방법을 설명합니다.
프로세스
강화 검사기 없이 파일의 노트를 스캔하려면 다음을 사용합니다.
$ annocheck --enable-notes --disable-hardened file-namefile-name 을 파일 이름으로 교체합니다.
4.4.3. 중복 annobin 노트 제거 링크 복사링크가 클립보드에 복사되었습니다!
annobin 을 사용하면 바이너리 크기가 증가합니다. annobin으로 컴파일된 바이너리의 크기를 줄이기 위해 중복 노트를 제거할 수 있습니다. 중복 annobin annobin 노트를 제거하려면 binutils 패키지의 일부인 objcopy 프로그램을 사용합니다.
프로세스
중복
annobin노트를 제거하려면 다음을 사용합니다.$ objcopy --merge-notes file-namefile-name 을 파일 이름으로 교체합니다.