# 바이트코드 분석: Factorio의 Lua 보안 결함 해명

> Clean Markdown view of GeekNews topic #15598. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=15598](https://news.hada.io/topic?id=15598)
- GeekNews Markdown: [https://news.hada.io/topic/15598.md](https://news.hada.io/topic/15598.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2024-06-30T09:50:03+09:00
- Updated: 2024-06-30T09:50:03+09:00
- Original source: [memorycorruption.net](https://memorycorruption.net/posts/rce-lua-factorio/)
- Points: 2
- Comments: 0

## Topic Body

### Factorio의 Lua 보안 취약점 분석

#### Factorio란 무엇인가?

- Factorio는 공장을 자동화하여 로켓을 만들어 행성을 탈출하는 게임임
- 3,500,000개 이상의 게임 복사본이 판매되어 보안 연구자들에게 매력적인 타겟이 됨

#### 게임에서 Lua의 사용 방법

- Lua는 게임 로직을 구현하고, 모드와 커스텀 맵을 만들기 위해 사용됨
- 모딩 커뮤니티가 매우 활발하여 수천 개의 모드가 존재함
- Alien Biomes 모드는 551K 다운로드를 기록함

#### Lua 인터프리터의 네트워크 노출

- Factorio의 멀티플레이어 모드는 결정적 락스텝을 사용하여 클라이언트를 동기화함
- 한 플레이어가 Lua 코드를 실행하면 다른 플레이어도 동일한 코드를 실행해야 함
- 이를 통해 악성 Lua 코드를 네트워크를 통해 실행할 수 있는 가능성이 생김

#### 일반적인 익스플로잇 경로

- 악성 맵을 제공하는 Factorio 서버를 호스팅함
- 클라이언트가 서버에 연결하면 맵을 다운로드하고 Lua 코드를 실행함
- Lua 구현의 약점을 이용하여 가짜 객체를 생성함
- 메모리 누출/손상을 통해 프로그램의 동작을 변경함
- 이러한 강력한 프리미티브를 이용하여 코드 실행을 얻음

#### Lua 바이트코드의 위험성

- Lua는 인터프리터 언어로, 작성된 코드를 바로 실행하지 않고 바이트코드로 컴파일함
- 바이트코드를 직접 실행할 수 있으면 잘못된 바이트코드를 실행하여 메모리를 누출하거나 손상시킬 수 있음

#### 바이트코드 검증기

- Lua 개발자는 악성 바이트코드로부터 인터프리터를 보호하기 위해 바이트코드 검증기를 구현했으나, 반복적으로 우회 가능성이 발견되어 Lua 5.2에서 제거됨
- Factorio 개발자는 자체 바이트코드 검증기를 구현했으나, 일부 오프바이원 문제로 인해 완벽하지 않음

#### 가짜 객체 생성

- 가짜 객체를 생성하여 인터프리터의 모든 기능을 활용할 수 있음
- 문자열을 사용하여 임의의 데이터를 누출하고, 배열을 사용하여 임의의 메모리에 쓰기 가능
- 네이티브 함수를 호출할 수 있으면 실행 흐름을 제어할 수 있음

#### 주소 누출

- Lua의 print 함수는 주소를 누출할 수 있음
- Factorio에서는 제거되었으므로, 타입 혼동을 이용하여 주소를 누출하는 방법을 사용함

#### TValues 이해하기

- Lua는 동적 언어로, 변수의 타입이 런타임 동안 변경될 수 있음
- 내부적으로 Lua는 TValue 구조체를 사용하여 객체를 표현함
- TValue는 타입(tt_)과 값(value_) 속성을 가짐

#### FORLOOP을 이용한 타입 혼동

- FORLOOP opcode는 루프의 초기값을 숫자로 간주하여 타입 혼동을 일으킬 수 있음
- 이를 통해 주소를 누출할 수 있음

#### IEEE 754 이중 정밀도

- 이중 정밀도는 부호, 지수, 가수로 구성됨
- Lua는 정수를 표현하지 않으므로, 53비트까지는 정밀도 손실 없이 주소를 누출할 수 있음

#### 가짜 객체 검색

- Upvalues와 Closures를 이해하여 가짜 객체를 검색할 수 있음
- Upvalues는 외부 함수의 변수를 접근할 수 있게 함
- 바이트코드를 수정하여 Upvalue의 인덱스를 변경하면 가짜 객체를 검색할 수 있음

### GN⁺의 의견

- 이 글은 동적 언어의 보안 취약점을 이해하는 데 매우 유용함
- Factorio와 같은 인기 게임에서 발생할 수 있는 보안 문제를 잘 설명함
- Lua와 같은 언어를 사용하는 다른 프로젝트에서도 유사한 취약점이 존재할 수 있음
- 새로운 기술이나 오픈 소스를 채택할 때는 보안 검토가 필수적임
- 유사한 기능을 가진 다른 프로젝트로는 Minecraft의 모딩 시스템이 있음

## Comments



_No public comments on this page._
