설명
하드코딩된 HMAC 키는 소스 코드 내에 메시지 인증에 사용하는 비밀 키가 직접 포함된 경우 발생하는 보안 취약점입니다. 이런 경우 공격자는 소스 코드 유출, 디컴파일 또는 저장소 접근만으로 중요한 비밀정보를 쉽게 탈취할 수 있습니다.
공격자는 하드코딩된 HMAC 키를 악용하여 인증 우회, 위조 토큰 생성, 메시지 변조 등 다양한 공격을 할 수 있습니다.
잠재적 영향
- 인증 우회 및 위조 (인증 위조): 공격자가 키를 알아내면 접근 권한이 없는 리소스에 접근하거나 인증 우회가 가능합니다.
- 데이터 변조 (데이터 변조): 공격자가 키를 이용해 합법적으로 보이는 위조 메시지를 생성하거나 서명된 데이터를 변경할 수 있습니다.
- 메시지 인증 무력화: 키를 사용하는 인증·메시지 무결성 보호가 무력화될 수 있습니다. HMAC은 메시지 내용을 암호화하지 않습니다.
해결 방법
- 비밀 키(Secret Key)는 소스 코드에 직접 작성하지 말고 환경 변수(Environment Variable)나 안전하게 보호된 구성 파일을 통해 불러오세요.
- 코드 저장소에 비밀 값을 노출하지 마세요.
- 하드코딩된 키를 발견했다면 즉시 폐기·교체하고, 키가 유출된 경우 관련 로그 등을 점검하여 피해를 파악하세요.
예시
변경 전
javascript
const crypto = require('crypto');
const HMAC_KEY = 'abcd1234abcd1234abcd1234'; // 하드코딩된 키
function makeHmac(data) {
return crypto.createHmac('sha256', HMAC_KEY).update(data).digest('hex');
}
변경 후
javascript
const crypto = require('crypto');
const HMAC_KEY = process.env.HMAC_KEY; // 환경 변수로부터 키를 불러옴
function makeHmac(data) {
if (!HMAC_KEY) {
throw new Error('HMAC 키가 설정되지 않았습니다.');
}
return crypto.createHmac('sha256', HMAC_KEY).update(data).digest('hex');
}
설명:
- 변경 전: 비밀 키(HMAC 키)가 코드에 직접 노출되어 있어, 코드가 유출될 경우 공격자가 키를 쉽게 획득할 수 있습니다.
- 변경 후: 비밀 키를 환경 변수로부터 읽어와서 보안성을 높였으며, 코드 자체에 키를 저장하지 않습니다. 환경 변수의 공급 경로와 접근 권한도 보호하고 키를 로그에 남기지 마세요.