코드 서명 (Code Signing)
한 줄 정의: 소프트웨어에 개발자의 전자서명을 붙여, 그 출처가 진짜이고 배포 후 변조되지 않았음을 사용자가 검증할 수 있게 하는 기법입니다.
쉽게 풀면
편지에 봉인 도장을 찍어 보내는 것과 비슷합니다. 개발자가 자신의 개인 키로 프로그램에 서명을 남기면, 사용자는 그에 맞는 공개 키로 '이 프로그램은 정말 이 개발자가 만들었고, 도중에 손대지 않았다'를 확인할 수 있습니다. 봉인이 뜯겨 있으면(변조되면) 검증에 실패합니다.
왜 중요한가
코드 서명은 사용자가 내려받는 소프트웨어의 출처와 무결성을 보장해, 악성코드가 정상 프로그램으로 위장하거나 공급망 도중에 변조되는 것을 막는 핵심 장치입니다. 운영체제와 앱 스토어가 신뢰할 수 있는 소프트웨어를 판별하는 기준이 됩니다.
논문에서는 이렇게 쓰입니다
"운영체제는 코드 서명이 유효하지 않거나 신뢰된 인증기관이 발급하지 않은 실행 파일에 대해 경고를 표시하거나 실행을 차단한다."
조금 더 깊게 보면
코드 서명은 공개키 기반구조(PKI)를 활용합니다. 개발자는 코드의 해시값을 개인 키로 암호화해 서명을 만들고, 이 서명과 함께 인증기관이 발급한 인증서를 소프트웨어에 첨부합니다. 사용자 측은 인증서의 신뢰 사슬을 확인한 뒤 서명을 검증합니다. 서명용 개인 키가 유출되면 공격자가 악성코드에 정상 서명을 붙일 수 있으므로, 서명 키는 하드웨어 보안 모듈에 보관하는 것이 권장됩니다.
주의할 점
코드 서명은 '누가 만들었고 변조되지 않았음'만 보장할 뿐, 그 코드가 안전하거나 악성이 아님을 보장하지는 않습니다. 서명 키가 탈취되면 악성코드도 정상 서명을 가질 수 있다는 점도 유의해야 합니다.