본 글에서는 MEGA의 취약점에 대해 다룬 논문(이하 2번 논문)을 소개합니다. 해당 논문은 MEGA: Malleable Encryption Goes Awry(이하 1번 논문)서 소개된 attack surface에서 정보를 더 효율적으로 추출하는 방법을 제안합니다.
간략히 설명하자면, 1번 논문에서는 RSA private key가 AES ECB mode로 암호화되었다는 사실을 이용하여 클라이언트의 로그인 시도가 임의의 수와 RSA public moduli
2번 논문에서는 유저가 challenge에 응답하는 과정에서 송신하는 정보의 양이 1번 논문의 공격자가 얻는 정보의 양보다 훨씬 많다는 점에 주목합니다. 다른 방식으로 다른 정보를 얻는 oracle과 payload를 구성하고, 적게는 6번에서 많게는 17번 정도의 로그인 시도만으로 유저의 RSA private key를 복구합니다.
MEGA의 구성
우선 공격 대상인 MEGA에서 프로토콜이 어떻게 구성되는지를 살펴보겠습니다. 공격 내용 설명의 편의를 위해 실제와는 다소 다를 수 있습니다.
[유저 생성 시]
각 유저에 대해 다음의 정보가 생성됩니다. 이는 로그인 시 변하지 않는 불변값입니다.
- master key (16byte) : AES Encryption을 위한 키입니다. MEGA에서는 ECB mode로만 AES를 활용하기에 iv값은 필요하지 않습니다.
- shared key : RSA2048 private key를 생성합니다. 구성은 다음과 같습니다.
: public moduli 의 서로 다른 두 소인수입니다. 각각 1024비트의 소수입니다. : secret exponent입니다. public exponent 에 대해 을 만족합니다. : 로 정의되는 값입니다. 연산속도 향상을 위한 CRT-RSA에서 사용되는 값으로써 저장되어있습니다
참고로, MEGA의 웹 클라이언트에서는 public exponent
해당 정보를 생성한 후 shared key는 master key를 이용하여 AES ECB mode 암호화한 결과값

[유저 로그인 시]
유저의 로그인 시도가 발생할 시 서버는 다음과 같은 challenge
유저는
서버는 해당 값이
Malleable Encryption Goes Awry (1번 논문)
서술의 편의를 위해
에서
이때, 우리는 이 식을 계산할 때 사용되는
물론 이것이 암호화된 채로 서버에 저장되어있어 서버가 원하는 값으로 바꾸는 것은 불가능합니다만, 값을 바꾸는 것 자체는 가능합니다. 가령 40번 블럭을 랜덤으로 바꾸는 것이 이에 해당합니다.
위 내용을 기억하며, 서버가 challenge
유저는 우선
유저는 아래 식을 이용하여
여기서,
[ 1.
따라서
[2.
즉 우리는 SID가 0인지 아닌지를 통해
HNP-SUM: Cryptanalyzing MEGA in Six Queries and Other Applications (2번 논문)
2번 논문의 저자는 1번 논문에서 서술된 공격에 대해 다음과 같은 점을 지적했습니다.
- 1번 논문에서 이용하는 Coppersmith's method의 SOTA를 고려할 때, 로그인 시도의 수는 최소 512번 이상이다.
- 한 유저가 512번 로그인을 시도하는 것은 장기간의 수집이 필요하며, 현실적으로 불가능에 가깝다.
- 각 로그인 시도에서 유저는 344비트의 값을 반환하나, 이를 1비트의 정보로 치환하여 사용한다.
따라서 2번 논문의 핵심은 각 로그인 시도로부터 더 많은 정보를 얻는 것이며, 이는 CRT-RSA의 마지막 계산인
가 Hidden Number Problem(이하 HNP)와 닮아있다는 것입니다. 저자는 이를 형식화하여 HNP-SUM을 소개합니다.
[HNP with Small Unknown Multiplier]
HNP-SUM에서
를 만족하는
이때 공격자의 목표는
[HNP-SUM to MEGA RSA Key Recovery]
HNP-SUM의 해결 방법을 다루기 전에, 이를 해결할 수 있을 때 MEGA에 어떻게 적용할 수 있는지 살펴보겠습니다.
모든 challenge
1번 논문에서와 유사하게
동일한 논리로, 같은
두 식을 빼면 다음과 같습니다.
이때, 고정된
이 경우 다음 식이 성립합니다.
위 식을 적용하여 서버가 획득한 정보를 다시 작성하면 다음과 같습니다.
이때
위 식에서
즉, 서버는 각 로그인 시도로부터
로 고정합니다. 18번 블럭은 가 포함된 두 번째 블럭이자 의 비트만으로 구성된 첫 블럭입니다. 후술할 논리에 의해 이 값을 근사할 수 있습니다. 는 로그인 시도의 수에 따라 1부터 8까지를 사용합니다. 이는 의 길이와 의 상위 비트를 포함하는 블럭들입니다.
이는 다음과 같은 정수
또한, 비둘기집의 원리를 이용하여 그러한 음이 아닌 정수
이때,
서버는
한편,
올바르지 않은
올바른
[How to solve HNP-SUM with
이때 두 식의 적절한 선형조합으로 다음 식을 얻을 수 있습니다.
위 값의 절댓값은
즉,
[How to solve HNP-SUM with
하지만 이 경우 lattice reduction으로 구한 SVP를 해석하는 것이 쉽지 않습니다.
2번 논문의 저자는 두 행벡터만을 이용하여 구해진 부분격자(sublattice)들의 결과 역시
저자는 실험적으로
이와 같은 결과를 활용하여 저자는 해당
위와 같은 격자에 대해 저자는 다음의
이때,
공격자는
이러한 행렬의 정의는 각
여기까지의 내용으로 기본적인 공격의 골격을 알아보았습니다. 다만 위와 같은 과정만으로는 몇가지 한계가 존재합니다.
- 공격에서 사용 가능한 블럭의 수가 한정적이므로, 더 많은 로그인 시도를 확보할 수 있을 경우 사용할 페이로드의 수가 한정적입니다.
- 상위 8비트를 bruteforce하므로, 수행해야하는 lattice reduction의 수가 매우 많습니다.
따라서, 이후 내용에서는 위 3가지 한계에 대한 저자의 접근을 소개하겠습니다.
[How to make more available payloads]
해당 문제에 대한 해결법은 사실 간단합니다. 이전에 40번 블럭을 변조하여
이때 각 식에서 중복되는
두 번째 식의 좌변은 첫 식의 좌변에 어떠한 상수를 곱한 값입니다. 따라서 두 식의 좌변을 각각
첫 식으로부터 다음과 같은 사실을 알 수 있습니다.
또한, 두 번째 식으로부터 다음과 같은 사실을 알 수 있습니다.
이를 종합하면
[How not to bruteforce MSBs]
상위 8비트를 bruteforce해야했던 가장 큰 이유 중 하나는, 모르는 비트의 위치가 불연속하면 lattice reduction을 통한 결과를 얻기 어렵기 때문입니다. 이와 같이 모르는 비트의 값이 2개의 연속한 위치로 표현되는 HNP의 변형 문제를 HNP-2H(2 Holes)라 하며 이 경우 다음과 같은 방법으로 해결할 수 있습니다.
핵심 아이디어는
공격자는 lattice reduction을 통해 짧은 벡터
실제 공격에서 사용되는 값을 대입하여 위 식에서 보인 값의 상한을 확인하여 보면 약간의 정보손실이 존재하는 것을 확인할 수 있습니다. 다만 해당 기법을 통해 511번의 bruteforce를 피하고 HNP-SUM을 푸는 것만으로 문제를 해결할 수 있다는 장점이 있습니다.
Conclusion
본 글에서는 두 논문에서 MEGA의 구조적 취약점을 활용하여 유저의 RSA private key를 복구하는 과정을 살펴보았습니다.
특히 2번 논문에서는 격자를 활용한 정보 추출 방식과, 또다른 격자를 활용하여 공격을 최적화하는 방식을 확인하였습니다.
'ctf' 카테고리의 다른 글
2023 GoN Spring Qual writeup (0) | 2023.03.23 |
---|---|
쇼어 알고리즘 바닥부터 설명하기 (Shor's Algorithm explained from scratch) (1) | 2023.03.02 |
2022 Christmas CTF 후기 (0) | 2022.12.26 |
Whitehat Contest 2022 본선 Crypto writeup (0) | 2022.12.04 |
2022 Fall GoN Open Qual CTF Write-up (1) | 2022.08.28 |