데이터가 가로채지거나 변조될 수 있는 세상에서 수신 파일의 진위성에 대한 확신은 필수적입니다. 예를 들어 사용자 A가 이메일로 사용자 B에게 바이너리 파일을 보낼 때, B는 파일이 변조되지 않았음을 어떻게 확신할 수 있을까요? 디지털 서명(DS)은 데이터를 발신자의 고유 자격증명에 바인딩해 신뢰할 수 있는 솔루션을 제공합니다.
서명은 서명된 메시지에서 파생되어야 합니다.
발신자의 고유 정보를 포함해야 합니다.
생성이 간단해야 합니다.
위조가 계산적으로 불가능해야 합니다.
서명 크기는 작게 유지되어야 합니다.
이 글은 리눅스에서 64비트 ELF 바이너리의 무결성 검증을 위한 실용적 DS 구현을 시연합니다. 이 접근은 직접 서명 방식(제3자 중재자 없음)을 사용하며 서명용 개인키와 검증용 공개 인증서에 의존합니다.
DS 구현 예제
서명 구현에는 다음 단계가 포함됩니다:
소스 바이너리의 MD5 해시 생성.
개인키와 자기 서명 공개 인증서 생성.
바이너리 서명:
MD5 해시를 개인키로 암호화.
암호화된 해시를 ELF 파일의 새 .sig 섹션에 저장.
인증서를 ~/.ssh에 저장해 추후 검증용.
전체 과정은 openssl, objcopy, md5sum으로 스크립트화할 수 있습니다. 아래는 ELF 바이너리 서명을 자동화하는 샘플 스크립트 sign_elf.sh입니다. (줄 번호 없는 소스 코드는 기사 끝에 있습니다.)
#!/bin/bash KEY_DIR="$HOME/.ssh" PRIVATE_KEY="$KEY_DIR/priv.key" CERTIFICATE="$KEY_DIR/pub.crt" SUBJECT="/C=RU/ST=Nizhni Novgorod/L=Nizhniy Novgorod/O=Auriga/OU=DEV/CN=www.auriga.com" if [ "$#" = "0" ]; then echo "Usage: sign_elfs.sh [ELF files]" exit 1 fi [ ! -d "$KEY_DIR" ] && mkdir "$KEY_DIR" # 개인키와 인증서 생성 openssl req -nodes -x509 -sha256 -newkey rsa:4096 -keyout "$PRIVATE_KEY" -out "$CERTIFICATE" -days 365 -subj "$SUBJECT" for ELF_BIN in "$@"; do ELF_BASE_NAME="${ELF_BIN##*/}" ELF_BIN_SIGNATURE="$ELF_BASE_NAME.sha256" ELF_BIN_MD5="$ELF_BASE_NAME.md5" if [ ! -f "$ELF_BIN" ]; then echo "Error: no such file $ELF_BIN" exit 103 fi # 기존 .sig 섹션 제거 objcopy --remove-section=.sig "$ELF_BIN" # 512바이트 제로 채움 .sig 섹션 추가 rm -f dummy.txt touch dummy.txt truncate --size=512 dummy.txt objcopy --add-section .sig=dummy.txt --set-section-flags .sig=noload,readonly "$ELF_BIN" # 바이너리 MD5 해시 계산 (.sig 섹션 포함) md5sum "$ELF_BIN" | awk '{ print $1 }' > "$KEY_DIR/$ELF_BIN_MD5" # 개인키로 MD5 해시 서명 openssl dgst -sha256 -sign "$PRIVATE_KEY" -out "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # 즉시 서명 검증 (선택 사항) openssl dgst -sha256 -verify <(openssl x509 -in "$CERTIFICATE" -pubkey -noout) -signature "$KEY_DIR/$ELF_BIN_SIGNATURE" "$KEY_DIR/$ELF_BIN_MD5" # 암호화된 해시를 .sig 섹션에 임베드 objcopy --update-section .sig="$KEY_DIR/$ELF_BIN_SIGNATURE" --set-section-flags .sig=noload,readonly "$ELF_BIN" # 검사를 위해 .sig 섹션 내용 표시 objdump -sj .sig "$ELF_BIN" done rm -f dummy.txt ls -ls ~/.ssh