2019719

개발팀 블로그: 취약점 해부

이번 개발팀 블로그에서는 취약점과 저희의 해결법, 그리고 그 해결책이 향후 취약점에 어떤 의미를 지니는지 알아보겠습니다.

타임라인

5월 11일~12일

  • 5월 초에 Rainbow Six 커뮤니티에서 Clash의 방패 취약점, 대인 지뢰 취약점, 이동식 방패까지 세 가지 취약점이 관심을 끌었습니다. 
  • 팀이 주말 동안 상황을 주시한 결과, 금세 시급한 문제라는 사실이 밝혀졌습니다.

5월 13일

  • 팀이 취약점 조사를 개시했습니다.  첫 단계는 문제 파악을 위해 취약점을 정확하게 반복 재현한 후, 핵심 원인을 식별하는 것이었습니다.
  • 초기 조사 결과 문제 범위를 파악할 시간이 더 필요했으며 빠른 해결은 불가능했습니다.
  • 취약점이 커뮤니티에서 계속 퍼져나가자, 저희는 단기적인 영향의 완화책을 논의하기 시작했습니다.

5월 15일

  • Rainbow Six Siege의 프로젝트 대표부가 취약점에 대해 의논했습니다. 대량의 데이터를 통해 게임 내 취약점의 정확한 범위와 영향을 알아내야 했습니다.

5월 16일

  • 저희는 데이터를 검토한 후인 16일 아침에 Clash, 대인 지뢰, 이동식 방패를 비활성화하기로 결정을 내렸습니다.
  • 여러 팀이 정규 업무를 멈췄고, 저희는 Clash, 대인 지뢰, 이동식 방패 사용을 비활성화하는 해결책을 만들고 적용하는 방안을 모색했습니다.
  • 저희는 가능성 있는 해결책들이 완성되는 대로 테스트하기 시작했습니다. 문제에 접근할 5가지 잠재적인 방법을 찾아냈고, 여러 차례의 실패 끝에 마침내 마지막 접근법이 성공을 거뒀습니다.

5월 17일

  • 첫 번째와 두 번째 긴급 테스트에 성공한 후, 저희는 긴급 대책으로써 Clash, 대인 지뢰, 이동식 방패를 금지했습니다.

5월 24일

  • 완전한 해결을 하려면 더 많은 시간이 필요하다는 걸 파악했습니다. 특히 수정 과정에는 핵심 시스템 처리 절차, 그중에서도 어떤 패킷이 서버에 전송되는지를 건드리기 때문입니다. 하지만 Clash와 핵심 도구의 제거는 게임플레이에 심각한 영향을 미친다는 것을 알고 있기 때문에, 팀들은 안전한 도입이 가능한 여러 가지 안전책을 만들기 위해 병행 작업을 하기 시작했습니다.

6월

  • 이어지는 몇 주 동안 취약점 보고서가 다시 올라오기 시작했습니다.
  • 하지만 전환 준비는 이미 끝났습니다. 저희는 빠르게 새 보고에 대응해 Clash와 IQ를 비활성화했습니다.
  • 이 시점에서 팀은 이미 취약점들의 근본적인 원인에 대한 완전하고 적용 가능한 해결책의 마무리 단계를 마쳤습니다. 내부 테스트를 통해 이미 긍정적인 결과를 보았으나, 자신 있게 본 서버에 배포하기에 앞서 더 큰 규모의 테스트를 위해 우선 테스트 서버를 거쳐야 했습니다.

6월~7월

  • 글로벌 오더링이 6월 말에 먼저 PC에, 7월에는 콘솔에 적용됩니다.
  • 저희는 이 시기에 글로벌 오더링 변경의 성과를 모니터링하고 다시 취약점이 돌아올지 조짐을 확인합니다.

전환 + 안전책

팀 일부가 해결책에 뛰어들던 때 다른 팀원들도 더 오래 지속할 수 있는 단기적 해결책을 만든다는 목표를 품고, 초반에 여러 단기적 안전책 개발을 시작했습니다. 취약점 방식만을 겨냥한 이 전환과 안전책들은 완전한 해결을 의도한 것이 아니었습니다. 그 대신, Clash와 두 도구 제거가 게임 플레이 건강에 미치는 비용을 따져본 후 팀이 내린 결정이었습니다. 커뮤니티에서 더 많은 발생을 보고할 위험성을 감수한 채 곧 라이브 서버에 공개되었습니다.

대원을 제거하고 로드아웃에 손을 댄다는 건 가벼운 결정이 아닙니다. 저희는 플레이어 여러분이 게임 내 콘텐츠를 잠금 해제하기 위해 소비한 시간과 노력을 존중하고, 핵심 게임플레이 역할 제거가 Rainbow Six Siege의 메타와 균형에 미칠 수 있는 막대한 영향을 인지해야 하는 입장입니다. 그러나 당시 상황을 보면 저희는 완전히 해결되리라는 전망만 보고 도박을 거는 건 용인할 수 없는 해결책이라고 봤습니다. 저희는 플레이어 여러분을 위해 안전하고 빠르게 취약점을 고치고, 게임플레이를 정상화해야 했습니다.

안전한 해결책은 회귀나 의도치 않은 부수 피해를 일으키지 않도록 국한적이고, 빠른 응답을 위해 쉽게 수정할 수 있어야 하며, 빠른 전달을 위해 최소한의 테스트를 요해야 하는 등 여러 조건을 만족시켜야 했습니다. 결과적으로 대원 및 도구 전환은 안전책을 준비하고 테스트하기 위한 궁여지책이자, 매우 단기적인 해결책이란 사실을 인지한 채 취약점을 빠르게 해결하고자 한 저희의 첫 대응이었습니다.

글로벌 오더링이란 무엇입니까?

Rainbow 내의 각 대원, 도구, 수류탄, 방패, 카메라, 벽, 시설은 객체입니다. Rainbow Six Siege의 모든 객체는 매 단계 행동이 수행될 때마다 서버에 메시지(패킷)를 보냅니다. 예를 들어, 도구를 사용하면 대원은 “내가 도구를 장착하고 있다”와 “내가 도구를 사용하고 있다”는 메시지를 차례로 보냅니다. 그와 동시에, 도구도 “도구 활성화”와 “도구 배치 완료” 같은 메시지를 동시에 서버에 전송합니다. 서버는 이 메시지들을 게임 내 다른 플레이어들에게 보냅니다.

이전에는 이 메시지들을 서버에 전달하는 순서가 게임 객체당 한 번만 보장되었습니다. 이는 메시지가 사라지거나 순서에 맞지 않게 서버에 전달될 때 전달되지 않을 가능성이 있었다는 뜻입니다. 이 취약점은 네트워크 프로토콜의 결함을 이용하여 일제히 대량의 행동을 스팸하고, 해당 네트워크 메시지의 수신 오류 가능성을 늘렸습니다. 그 결과 서버에 정보가 잘못 반영되어 해당 플레이어의 게임에 의도한 대로의 적절한 행동을 재현하는 일에 실패했습니다.

저희의 문제 해결책인 글로벌 오더링은 모든 메시지를 글로벌 수준에서 정렬하도록 네트워크 엔진을 변경합니다. 데이터가 확실하게 전송되도록 메시지 역시 다중 전송됩니다. 이제 모든 게임은 동일한 순서로 메시지를 받으며, 각 플레이어의 게임에서 응답이 동시 발생합니다.

진행 중인 취약점들이 전부 이 핵심 과정과 관련되어 있다는 것을 알았을 때, 저희는 글로벌 오더링에 치밀하게 접근해야 했습니다. 저희는 이 변화에 따른 부작용이 없도록 보장할 필요가 있었습니다. 결과적으로 글로벌 오더링으로의 변경은 대역폭에 추가로 부담을 주지만, 변경에 따른 이점이 대역폭 비용의 소폭 상승을 감수할 가치가 있다고 생각해 이를 진행하기로 했습니다.

향후에의 의미

다른 소셜 채널 방문하기

facebook icontwitter iconyoutube icontwitch icon