하드웨어 보안

위 비밀번호 비교 함수에 숨어 있는 문제와 대책의 조합으로 올바른 것은?

int check(const char *in, const char *pw, int n) {
    for (int i = 0; i < n; i++)
        if (in[i] != pw[i]) return 0;
    return 1;
}
  1. An이 크면 계산 결과가 틀린다. 비교 전에 n을 작게 한다
  2. B첫 불일치에서 끝나므로 몇 번째 글자까지 맞는지 처리 시간으로 알 수 있다. 불일치가 있어도 끝까지 비교하고 결과를 모아서 반환한다
  3. C문제가 없으며 이대로 안전하다
정답과 해설 보기

정답: B. 첫 불일치에서 끝나므로 몇 번째 글자까지 맞는지 처리 시간으로 알 수 있다. 불일치가 있어도 끝까지 비교하고 결과를 모아서 반환한다

이 함수는 첫 글자가 다르면 곧바로, 첫 글자가 맞으면 두 번째 글자를 비교한 뒤에 반환하므로, 맞는 글자 수만큼 처리 시간이 길어집니다. 공격자는 한 글자씩 후보를 시도하여 시간이 길어지는 것을 고르면, 모든 조합을 시도하지 않고도 비밀번호를 추측할 수 있습니다. 모든 글자의 차이를 배타적 논리합(XOR) 등으로 모아 마지막에 판정하면, 시간은 맞는 글자 수와 관계없이 일정해집니다.

  • A. 결과는 올바르지만 시간으로 정보가 유출됩니다.
  • B. 올바릅니다. 시간 차이를 만들지 않는 것이 중요합니다.
  • C. 타이밍 공격에 취약한 작성 방식입니다.
이 분야 연습하기 분야로 돌아가기

하드웨어 보안의 다른 문제

  1. 캐시를 이용한 사이드 채널 공격이 성립하는 주된 이유는?
  2. Spectre라고 불리는 투기적 실행 취약점의 원리로 올바른 것은?
  3. 투기적으로 실행된 명령의 결과가 취소되어도 Spectre와 같은 공격으로 정보가 유출되는 이유로 올바른 것은?
  4. 일부 CPU에서 문제가 된 Meltdown이라고 불리는 취약점의 원리로 올바른 것은?
  5. Meltdown에 대한 소프트웨어 대책으로 도입된 KPTI(커널 페이지 테이블 격리, Kernel Page-Table Isolation)의 개념으로 올바른 것은?