검색

4.9. Annobin 프로젝트

download PDF

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 플러그인 활성화

다음 섹션에서는 gccclang 을 통해 annobin 플러그인을 활성화하는 방법을 설명합니다.

절차

  • gcc 를 사용하여 annobin 플러그인을 활성화하려면 다음을 사용합니다.

    $ gcc -fplugin=annobin
    • gccannobin 플러그인을 찾지 못하는 경우 다음을 사용합니다.

      $ 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 플러그인에 옵션 전달

다음 섹션에서는 gccclang 을 통해 옵션을 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의 annobingcc 간의 동기화 문제로 인해 다음과 유사한 오류 메시지와 함께 컴파일이 실패할 수 있습니다.

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
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.