무작위가 아닐 때
(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의 정확성이 매우 중요함을 지적함.