련선웨어

덤프버전 :


danooct1의 시연 영상

rensenWare[1]

1. 개요
2. 발단
3. 작동 방식
4. 여파
5. 법적 문제


1. 개요[편집]


련선웨어 소스코드[2]
련선웨어 복호화 도구[3]

디시인사이드 동방 프로젝트 갤러리P.노우렛지라는 고정닉을 가진 유저가 제작한 랜섬웨어.

참고로 이 유저는 사건 이후에도 동갤에서 간간히 활동 중이고 위키백과 련선웨어 항목에 자신의 실명이 실린 것에 대해서 언급은 했는데 어차피 GitHub에도 실명 까발리고 다녀서 딱히 생각은 없다고... 또 이것이 일본 동인작가에 의해 만화로 그려진 것에 대해서 당황스러운 반응을 보였는데 여파 문단 참조.


2. 발단[편집]


2017년 4월 5일 동방 프로젝트 갤러리P.노우렛지라는 고정닉을 가진 유저가 내가 도대체 뭘 만든거지[A][4]라는 제목으로 자신이 랜섬웨어를 만들었다는 글을 올렸다. 카지노 바이러스와 유사하게 돈을 요구하지는 않으나 복호화에 확률이 적용되지 않는다. 초기 버전의 경우 동방성련선의 가장 높은 난이도인 루나틱[5]을 클리어 한 후 그 리플레이 파일을 올려 검사하는 방식이었으나 최종 버전에서는 루나틱 모드에서 플레이할 때 게임 프로세스의 메모리를 읽어와 실시간으로 점수를 감지하여[6] 2억점[7]에 도달하면 암호화가 해제되는 식으로 변경되었다.


3. 작동 방식[편집]


전체적인 작동 과정만 보면 여타 랜섬웨어와는 다르지 않지만 특이한 점은 해제 조건이 금전의 지불이 아닌 동방성련선의 실행 여부를 감지하고 점수를 읽어와 2억점에 도달하면 복호화를 진행하는 방식이다.

암호화 키는 다른 서버에 전송되거나 파일의 형태로 저장되지 않고 사용자의 메모리에 상주하고 있으며 랜섬웨어 실행과 동시에 랜덤으로 생성된다. 이후 암호화 과정이 시작되는데, 제작자가 디버깅을 미흡하게 한 탓에 접근할 드라이브가 접근 가능한 드라이브인지[8] 확인하지 않고 접근하여 프로그램이 에러를 일으키며 종료되어 버린다.

그러나 성공적으로 암호화가 완료된 경우 붉은 바탕에 무라사 미나미츠의 일러스트가 들어간 랜섬노트가 뜨고 동방성련선에서 점수 2억점을 도달하라는 메세지가 표시된다. 이후 게임이 실행되면 난이도를 체크하면서 루나틱으로 설정될 때까지 점수 확인을 시작하지 않으며 루나틱으로 난이도가 변경되면 비로소 점수 확인이 시작된다.

피해자가 2억점에 도달할 경우 점수와 난이도 감지를 중단하고 바탕화면에 랜덤으로 생성된 키를 bin 파일의 형태로 저장한 뒤 복호화를 개시하며 만약 복호화에 실패한 파일이 있을 경우를 위해 수동 복호화 툴을 사용할 수 있도록 버튼이 표시된다.

또 복호화 툴을 실수로 꺼도 바탕에 키파일만 그대로 있으면 다시 실행시 그냥 수동 복호화 툴로 넘어간다.

내용을 번역하면 아래와 같다:

경고!

시스템이 RensenWare에 의해 암호화되었습니다.

이게 도대체 뭡니까?

무라사 미나미츠 선장이 문서, 음악, 사진 및 일부 프로젝트 파일과 같은 귀중한 데이터를 암호화했습니다.

무작위 키를 사용하여 매우 강력한 암호화 알고리즘으로 암호화되기 때문에 이 응용 프로그램 없이는 복구 할 수 없습니다.

파일을 복구하려면 어떻게 해야하죠?

간단합니다. 동방성련선을 실행하고 루나틱 난이도에서 2억 점을 넘으면 됩니다.

이 응용 프로그램은 자동으로 TH12 프로세스 및 점수를 감지합니다.

치트를 사용하거나 이 프로그램을 종료할 경우 암호화 키가 날아갑니다![9]


본연의 성능(?)으로 평가하면 그냥 장난감, 그것도 고장난 장난감 수준으로 드라이브 목록을 제대로 못 읽어서 ODD 드라이브를 암호화하려다 오류나고, 오류처리도 제대로 구현이 안돼있어[10] 그대로 프로그램이 뻗어 버린다거나 자체 보호 기능이 전혀 없는 건 물론이고 메모리 변조를 통한 점수조작과 2억 리플레이 파일으로 간단히 해제할 수 있는 등[11] 여러모로 엉성한 모양새다. 그래도 일단은 랜섬웨어고 무엇보다 복호화 키를 저장하지 않기 때문에[13] 위험하긴 하다. 만약 감염됐다면 랜섬웨어를 종료하지 말고 무력화 툴을 다운받아 해결하자.

제작자는 순전히 흥미본위로 만든 듯 하지만 정작 제작자는 가상머신에서 안돌리고 호스트에서 돌리는 바람에[A][14] 제작자 본인이 감염되기도 했다.


4. 여파[편집]


사태 정리

개발자는 소스 코드를 GitHub에 업로드해서 논란이 일었다. 다행히도 디버깅을 잘 안 했기 때문에 실행이 안 된다고 한다. 따라서 제작자 본인 컴퓨터 감염이 처음이자 마지막 감염인 셈. 해외 리뷰어들은 디버깅을 한 뒤에 실행했다. 4월 7일 사과문과 함께 소스 코드를 내리고 해제 툴을 공개했다.

해외에도 소식이 알려지며 큰 웃음을 주었고 태국 뉴스에서도 보도되었다. 그리고 nProtect의 개발사 잉카인터넷 공식 블로그와 대한민국에서 공신력이 높은 편으로 손꼽히는 IT 블로그 울지않는 벌새도 이 소식을 전했다. 약 1달 후에 긴 기사가 나왔으며 네이버 메인에 올라갔다.[15]

2020년 4월 3일 일본의 やす라는 동인작가(트위터)가 이것을 주제로 개그 4컷을 그리면서 수출이 이루어졌다. #원본번역1번역2 그리고 이어진 제작자 P.노우렛지의 당황스러운 반응이 볼 만하다. 간간히 이 소재는 역수출되고 있으며 만화로 그려내는 일본인 작가들이 있을 정도.# 심지어 랜섬노트에 코메이지 코이시를 넣은 티셔츠 도안을 내놓은 사례도 있다.

비첼실버 서퍼(NES판) + 약 안쓰고 아이 키우기와 섞어서 해당 랜섬웨어를 풍자했다.[16]

이 여파로 인해 Steam에서 동방 프로젝트/게임을 다운로드할 때 안티 바이러스가 차단하는 일도 생긴다.

비슷한 것으로는 랜섬호스가 있다. 이 랜섬웨어는 파일 암호화 방식은 바탕화면의 txt, zip, 7z, jpg, png, gif 파일들의 내용을 읽어서[17] Base64로 인코딩한 뒤 파일로 저장하는 방식이다. 다만 BASE64로 인코딩하니 디코딩 과정에서 오류가 발생할 수 있으니 실행하지 마라는 경고와 이걸로 장난을 치다 형사님과의 면담 기회가 와도 책임지지 않는다는 경고도 있다. 이 랜섬웨어의 해제 조건은 히어로즈 오브 더 스톰을 1시간 하는 것. 조건방식은 히어로즈 오브 더 스톰의 창을 발견하고 창이 있는 동안 1시간이 지나면 복호화를 하는 방식이다. 히어로즈 오브 더 스톰을 실행하고 1시간 그대로 게임을 안 하고 둬도 복호화된다. 당연히 복호화 툴도 제공하고 있다. 랜섬호스 실행파일와 소스도 공개되었으나 현재는 복호화 툴만 제공한다.

련선웨어의 영향인지는 불명이지만 컴퓨터에서 바이러스를 검사할 때 다른 동방 작품들은 멀쩡한데 스팀판 지령전이나 성련선만 바이러스 취급을 받는 일도 종종 발생하고 있다.

2000년에도 X97M.Barisada.H라는 비슷한 컴퓨터 바이러스가 있었는데 컴퓨터의 파일을 걸고 게임 관련 지식으로 복구 여부가 결정되는 점이 공통점이다. 차이점으로는 설정 관련 퀴즈이며 동방 프로젝트가 아닌 창세기전 시리즈가 사용되었다. 무엇보다 가장 큰 공통점은 게임 소스를 보다시피 이것 역시 한국에서 만들어졌다.

1993년에 만들어진 에스파시오 바이러스는 강제로 팩맨을 하게 만드는 증상을 가지고 있다. 어찌 보면 련선웨어의 조상.


5. 법적 문제[편집]


피해 사례가 없으면 경찰이 수사를 하지 않을 뿐이지 만에 하나 저 공개된 코드를 기반으로 한 악성 코드가 진짜로 나오거나 하면 경찰 수사가 진행되면 처벌의 가능성이 높다. 대한민국에서는 정보통신망 이용촉진 및 정보보호 등에 관한 법률 제48조 2항에 의해 정당한 사유 없이 악성 프로그램의 유포시 징역 5년 혹은 벌금 5천만원 이하의 처벌을 받을 수 있으며 소스코드를 프로그램으로 판정한 판례가 존재한다. 링크

이에 관해 납득이 되지 않는 사람을 위해 한 가지 사례를 들자면 2011년 한국에서 열린 Power of Community 행사에서 이스라엘의 화이트 해커 야니브 미론이 한국 정부의 미사일과 핵 발전소가 해킹당할 수 있음을 시연하여 경고를 했다. 시연 자체는 가상 시스템을 두고 했으므로 불법이 아니었고, 시연이 끝난 후에 얼굴이 창백해진 한국 정부 관계자들이 야니브를 찾아가 자세한 방법을 알려달라고 부탁하자 야니브는 한국 정부 관계자들에게 "한국에서 해킹 방법의 공개는 합법인가?"라고 질문했고 정부 관계자들은 불법이라고 대답해서 야니브는 한국 법의 처벌을 받지 않기 위해 이스라엘에 돌아가 자기 블로그에 해킹 방법을 올렸다. 관련 기사 다만 이 기사는 법 해석을 잘못 한 것으로 봐야 한다. 학술적인 목적으로 악성 프로그램의 소스를 공개하는건 법문의 정당한 사유에 해당하기 때문. 당장 구글링만 해 봐도 한국인이 올린 해킹 방법이나 해킹툴 정도는[18] 얼마든지 찾을 수 있다.

즉, 학습/연구/보안 점검 등이 목적이라면 괜찮지만 련선웨어의 경우 정당한 목적으로 보기 에매하여 문제가 될 가능성이 있었던 것으로 보인다.

[1] 보통은 Rensenware라고 알려져 있으나 rensenWare가 맞다. camel case와 pascal case의 혼동 과정에서 생겨난 이름이다.[2] 위험한 코드가 제거된 버전[3] 동방 프로젝트 게임이 실행되지 않아도 복호화를 실행시킬 수 있다.[A] A B 2018년에는 멀쩡했지만 2019년 3월 18일 기준으로 삭제되있다.[4] 보고 싶다면 아카이브[5] 동방성련선탄막 슈팅 게임인 동방 프로젝트 게임 중에서도 가장 어려운 난이도로 손꼽힌다. 자세한 것은 문서 참조.[6] 이 때문에 2억점을 찍은 리플레이 파일을 실행하면 복호화가 가능하다.[7] 원래는 4억점이었다. 하지만 4억점 돌파는 어지간한 성루나 원코인 클리어러, 심지어 성루나 노미스 클리어를 밥먹듯이 하는 사람들에게도 달성하는건 어렵다. 이것 때문에 절반인 2억점으로 변경된 것으로 추정된다.[8] 비어 있는 CD 드라이브와 하드디스크를 구분하는 로직이 없다.[9] 실제로는 치트 감지를 하지 않는다.[10] 이 당시 개발자는 Directory.GetLogicalDrives() 메서드가 광학 드라이브나 빈 SD 슬롯까지 포함한다는 사실을 간과하고 있었다.[11] 제작자가 최초에 배포한 무력화 툴이 이 방식이다. 치트엔진 기반이라고 알려졌지만 이것은 설명을 쉽게 하기 위함이고 사실 치트엔진과는 관련이 없으며 Windows API를 이용하여 동작한다.[12] AES는 미국 정부에서 기밀 문서 암호화에 사용하는 알고리즘이다.[13] 복호화 키는 랜덤으로 생성하여 메모리 상에 올라간다. 그러므로 컴퓨터를 재부팅하거나 프로그램을 강제로 종료하면 복호화키가 사라져 AES-256 알고리즘이 파훼되지 않는 한 영원히 복구할 수 없다.[12] 이러한 점 때문에 복호화가 완료됐다 하더라도 일부 파일이 복호화가 안 될 가능성을 염두에 두고 복호화 전 복호화 키를 bin파일로 만들어 저장한다.[14] 아카이브[15] 현재는 네이버 뉴스에서 내려갔다.[16] 현재 이 링크로 들어가면 웬 성인 사이트로 들어가지며 폭유가 출렁이는(...) 의문의 성인만화가 나온다.(...) 호기심으로라도 들어갈 생각은 접어두자. 굳이 들어가겠다면 후방주의.[17] 암호화 대상은 바탕화면의 파일들[18] 다만 이 중 일부(크래킹을 유도하면서 서술된 경우)는 불법이며 학습/연구/보안 점검 등의 "정당한 목적"을 명시하지 아니한 경우 문제가 될 가능성이 있다.

파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는
문서의 r1119 판{{{#!wiki style="display: inline; display: 6.3;"
, 6.3번 문단}}}에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r1119 판{{{#!wiki style="display: inline; display: 6.3;"
, 6.3번 문단}}} (이전 역사)
문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)




파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-11-25 17:18:36에 나무위키 련선웨어 문서에서 가져왔습니다.