GN⁺: 무작위가 아닐 때
(orlp.net)When Random Isn't
- 약 10년 전의 일화로, 실제 코드를 잃어버려 정확히 기억나지 않는 부분이 있음을 양해 바람.
- 컴퓨터 보안을 좋아하는 사람이라면 누구나 즐길 수 있도록 일부 세부 사항이 단순화됨.
- 14살 때 World of Warcraft를 발견하고 중독됨.
- 게임의 사용자 인터페이스를 수정할 수 있는 애드온을 발견하고, 직접 만들기 시작함.
- Lua 프로그래밍 언어로 만들어진 애드온은
.lua
소스 파일 몇 개로 구성됨. - 게임이 직접 작성한 소스 코드를 로드하고 실행하는 것에 매료됨.
Add-on security
- 사용자가 프로그래밍 가능한 애드온을 가지는 것은 봇을 초래할 수 있어 나쁜 아이디어로 보일 수 있음.
- Blizzard가 만든 시스템은 임의의 프로그래밍 행동을 방지하기 위해 꽤 영리함.
- 대부분의 UI 요소는 장식적이거나 정보 제공용으로 완전히 제한이 없음.
- 캐릭터의 체력을 표시하는 API 호출과 같은 정보 수집 API는 제한이 없음.
- 그러나 일부 API 호출은 공식 Blizzard 코드에서만 호출될 수 있도록 보호됨.
- 게임 내에서 실제 행동을 수행하는 것과 관련된 API 대부분이 보호됨.
- 세계 위치와 카메라 방향을 얻는 API도 어느 시점에서 보호됨.
- 특정 주문을 시전하는 버튼을 만들고 싶을 때, 클릭 시 보안 환경에서 코드를 실행하는 특별한 버튼을 만들 수 있음.
- 이러한 버튼은 전투 중에는 생성/파괴/이동할 수 없어 전투 중 자동화를 방지함.
- 보안 환경은 프로그래밍 방식으로 어떤 주문을 시전할지 설정할 수 있지만, 임의의 자동화에 필요한 정보 수집은 허용하지 않음.
A backdoor channel
- 몇 년 후, 더 "진지한" 프로그래밍에 관심을 갖게 되면서 World of Warcraft를 거의 하지 않게 됨.
- 보안 환경을 무력화하고 싶은 생각이 계속 들었음.
- 제3자 소프트웨어를 사용하는 대신, 기술적으로 허용된 도구를 사용하여 도전적으로 해결하고자 함.
-
random
함수가 보안 환경에서 허용된 함수 목록에 있음을 발견하고, 이를 이용해 정보를 밀반입할 방법을 고안함.
Random number generator woes
-
random
은 C의rand
함수를 간단히 래핑한 것으로 밝혀짐. -
rand
의 구현은 단순하고 약한 선형 합동 생성기임. - RNG의 내부 상태를 역공학하여 정보를 전달하는 방법을 개발함.
Putting it together
- RNG의 내부 상태를 역공학할 수 있게 되면서, 보안 환경에서 임의의 자동화 결정을 내릴 수 있게 됨.
- 불안전한 환경에서 정보에 접근하여 결정을 내리고, 보안 환경에서 "무작위"로 선택된 행동을 수행함.
Conclusion
- Blizzard가 RNG 상태가 약하고 공유되는 문제를 언제 해결했는지, 문제가 있는지 인식했는지는 알 수 없음.
- 몇 년 후 코드를 다시 시도했을 때 작동하지 않았음.
- 실제로 사용하고 싶지 않았던 비디오 게임에서의 틈새를 이용한 것이었지만, 무작위로 보이는 것을 조작하는 것에는 마법 같은 매력이 있었음.
GN⁺의 의견
- 이 글은 컴퓨터 보안과 프로그래밍에 대한 흥미로운 사례를 제공함.
- 게임 내에서 보안을 우회하는 창의적인 방법을 탐구하는 과정은 프로그래밍 기술의 중요성과 잠재적 취약점에 대한 인식을 높임.
- RNG의 약점을 이용한 이야기는 소프트웨어 개발자들에게 보안과 알고리즘의 중요성을 상기시키는 교훈적인 사례임.
Hacker News 의견
-
한 사용자는 자신이 몇 달 전에 StackOverflow에서 "RNG(난수 생성기) 반전"에 대한 질문에 답변한 적이 있다고 언급함. 이 사용자는 Java RNG를 공격했는데, MSVC RNG와 유사한 LCG(선형 합동 생성기) 디자인을 사용하여 내부 상태의 절단을 출력하기 때문에 공격 방법이 매우 유사함.
- StackOverflow에서 "RNG 반전"에 대한 유사한 질문에 답변한 경험을 공유함. Java RNG와 MSVC RNG 모두 LCG 디자인을 사용하여 유사한 공격이 가능함.
-
다른 사용자는 서버가 동일한 RNG를 사용하고 있다면, 낮은 사용량의 서버, 낮은 핑, RNG의 현재 상태에 대한 정확한 창을 얻을 수 있는 능력, 그리고 높은 경제적 변동성을 가진 다른 이벤트를 빠르게 생성할 수 있는 능력이 있다면 이론적으로 이를 이용할 수 있을 것이라고 추측함.
- 서버가 같은 RNG를 사용한다면, 특정 조건 하에서 이를 이용할 수 있는 가능성에 대해 추측함.
-
또 다른 사용자는 주어진 선형 합동 RNG가 단지 12445개의 서로 다른 숫자만을 생성한 후 반복된다고 지적하며, 이 알고리즘에 대해 더 나은 매개변수를 사용하는 것이 합리적이라고 언급함.
- 선형 합동 RNG가 제한된 숫자만 생성하고 반복된다는 문제를 지적하며, 알고리즘 개선의 필요성을 강조함.
-
한 사용자는 월드 오브 워크래프트(WoW)가 자신의 프로그래밍에 대한 관심을 시작하게 했다고 말하며, 6살 때 게임이 출시되었고, 개인 서버가 등장하면서 자신만의 NPC를 만드는 방법에 관심을 가지게 되었다고 함. 이를 통해 Lua를 배우고, 개인 서버 코어를 컴파일하는 방법, SVN, 패치 적용 방법 등을 배웠다고 함.
- WoW가 프로그래밍에 대한 관심을 불러일으킨 경험을 공유함. 개인 서버와 Lua 학습을 통해 프로그래밍 기술을 습득함.
-
존 폰 노이만의 인용문을 공유하는 사용자는 모든 난수 생성 방법이 죄라고 말하며, 엄격한 산술 절차는 난수를 생성하는 방법이 아니라고 주장함.
- 존 폰 노이만의 난수 생성에 대한 견해를 인용함. 엄격한 산술 절차는 난수 생성 방법이 아님을 강조함.
-
한 사용자는 WoW의 경매장 스크립트를 작성했다고 말하며, 이 스크립트는 모든 경매를 스캔하여 저평가된 아이템을 구매하고, 재경매하는 기능을 가졌다고 함. 누군가가 가격을 낮추면, 스크립트는 취소하고 그보다 조금 낮은 가격에 다시 경매를 올릴 수 있었다고 함.
- WoW의 경매장에서 사용한 스크립트를 통해 무한한 금을 얻는 경험을 공유함.
-
해커뉴스가 약한 난수로 인해 해킹당한 사례를 언급하는 사용자가 있음. 관련 링크를 제공함.
- 해커뉴스가 약한 난수로 인해 해킹당한 사례를 언급하며, 보안 문제를 지적함.
-
"변수가 변하지 않고 상수가 상수가 아닐 때"라는 표현을 사용하는 사용자가 있음.
- 프로그래밍에서 변수와 상수의 역할에 대한 풍자적인 표현을 사용함.
-
WoW를 플레이하지 않았지만, 많은 애드온이 개인 채팅을 통신 수단으로 사용했다는 것을 들은 사용자가 있음. 만약 방법이 있다면, 사람들은 결국 그것을 찾아내고 사용할 것이라고 언급함.
- WoW 애드온이 개인 채팅을 통신 수단으로 사용했다는 사실을 듣고, 사람들이 통신 방법을 찾아내고 사용할 것이라는 의견을 제시함.
-
RNG의 경제적 인센티브와 관련하여, 아무것도 실질적으로 걸려 있지 않은 경우(예: 게임)에는 불완전한 RNG도 충분하다고 언급하는 사용자가 있음. 하지만 돈이 걸려 있거나 보안이 중요한 경우(예: 암호화폐 지갑이나 온라인 카지노)에는 RNG의 완벽성이 매우 중요해진다고 함.
- 게임과 같이 중요하지 않은 상황에서는 불완전한 RNG도 충분하지만, 금전적 가치나 보안이 중요한 상황에서는 RNG의 정확성이 매우 중요함을 지적함.