스팀 서드파티 서비스의 해킹 및 보안 문제
안녕하세요. 스팀잇 전용 앱 브라우저를 만들고 있는 @hanyeol입니다.
실로 오랜만에 포스팅을 올립니다. 그간 스팀잇 전용 앱 브라우저 개발에 매진하느라 포스팅할 시간도 없었습니다. 많은 분들이 관심을 기울여주고 계시는 스팀잇 전용 앱 브라우저는 어느새 그럴싸한 모습을 갖춰가고 있습니다. 개발이 어느 정도 진척되었는지 궁금하신 분들은 깃헙에 공개해놓은 개발 내용을 엿보시는 걸 환영합니다. :)
본론으로 들어가서, 바쁜 개발 과정에서도 오늘 포스팅을 쓰도록 맘 먹게 만든 건 다음 글 때문이었습니다. 스팀의 서드파티 앱 중 하나인 유토피안이 해킹을 당해서 해당 서비스에 로그인했던 사용자들의 보팅 권한을 맘대로 사용했다는 사건입니다.
유토피안 해킹으로 스팀커넥트 로그인 토큰 유출, 그걸로 보팅 어뷰징
이 사건은 분산화되고 탈중앙화된 블록체인(암호화폐) 시스템을 활용하는 서드파티 서비스들이 보안 설계에서 필수적으로 지켜야 할 몇 가지 지점을 시사하고 있습니다. KR 커뮤니티에서도 여러 개발자분들이 서드파티 서비스를 개발하고 있는데요, 이 글이 각 서비스 보안 설계에 있어 다소나마 도움이 되었으면 좋겠습니다.
서드파티 서비스가 지켜야 할 보안 원칙은 아래 3가지로 정리할 수 있습니다.
(1) 포스팅, 액티브, 메모 키는 반드시 사용자 PC/디바이스(로컬)에서 생성하여 로컬 스토리지에 저장해야 하며, 비밀번호나 사용자의 키가 네트워크 상으로 전송되어서는 안됩니다.
서드파티 서비스가 로그인을 위해 비밀번호를 입력받더라도 입력된 비밀번호는 네트워크 상으로 절대 전송되지 말아야 합니다. 이 부분이 중앙화된 서비스만을 다루던 개발자들이 쉽게 놓치는 부분인데요, 스팀과 같은 탈중앙화된 블록체인은 사용자 인증을 암호화 방식을 이용하여 로컬에서 직접 수행하면 됩니다. 즉, 사용자명과 비밀번호를 입력받으면, 로컬에서 암호화 계산을 통해 인증 값을 생성한 뒤, 해당 값을 스팀 블록체인으로부터 전송받은 사용자 정보의 값과 대조하는 방식으로 사용자 인증을 수행하는 것입니다. 이 과정을 서드파티 서비스가 스스로 수행한다면 사용자가 입력한 비밀번호를 네트워크 상에 전송할 필요가 전혀 없습니다. 마찬가지로 포스팅, 액티브, 메모 키 역시 사용자의 비밀번호를 통해 로컬에서 계산이 가능합니다. 이렇게 계산된 포스팅, 액티브, 메모 키는 서버에 올려놓아서는 안되며, 로컬 스토리지 기능 등을 이용하여 로컬에만 저장해야 합니다. 이 때, 좀 더 안전한 보안을 위해 암호화된 키를 저장하는 것을 추천합니다.
(2) 보팅이나 송금 등의 트랜잭션은 반드시 사용자 PC/디바이스(로컬)에서 전자서명해서 브로드캐스팅해야 하며, 이 때도 역시 사용자 키가 네트워크 상으로 전송되어서는 안됩니다.
1번 원칙을 이해하셨다면 2번은 거저먹기 입니다. 보팅이나 송금을 할 때, 사용자의 키를 이용하여 트랜잭션에 전자서명을 해야 하는데요, 이 전자서명을 로컬에서 진행해야 한다는 말입니다. 그렇지 않을 경우에는 사용자의 키가 네트워크 상으로 전송되야 하는데, 이 때 보안 위험이 발생합니다. 스팀 커넥트 v1에서 사용자 키를 쿠키로 저장한 뒤 요청 시 서버로 전송하는 위험한 행위를 했는데요, 이게 2번 원칙을 위반한 경우입니다. 탈중앙화된 블록체인에서는 중앙화된 서버의 도움 없이 클라이언트 스스로 트랜잭션을 처리할 수 있다는 사실을 절대 잊어서는 안됩니다.
(3) 비밀번호와 오너 키는 사용자 PC/디바이스(로컬)에도 저장하지 말아야 합니다.
스팀은 다른 블록체인과는 다르게 영리하게도 비밀번호를 사용자 키라는 매개체를 이용하여 이중화하였습니다. 이로 인해 서드파티 서비스들이 로그인 과정을 제외하고는 직접 비밀번호를 이용할 필요가 없습니다. 또한 비밀번호를 변경할 수 있는 막강한 권한이 부여된 오너 키 역시 서드파티 서비스들이 사용할 이유가 없습니다. 따라서 비밀번호와 오너 키는 아무리 로컬이라 할 지라도 저장해서는 안됩니다.
저희 팀이 개발하고 있는 모이또(Moitto)라는 이름의 스팀잇 전용 앱 브라우저는 위의 3가지 원칙을 지켜가며 개발을 진행하고 있습니다. 블록체인 서비스에서 가장 신경써야 하는 부분은 보안일 수 밖에 없습니다. 보안이 철저하지 못한 서드파티 앱으로 인해 블록체인 전체가 외면받는 일이 일어나지 않도록 각별히 노력할 때인 것 같습니다. 개발자 여러분, 오늘도 화이팅입니다~!
여러분의 보팅과 리스팀은 저희 팀에게 꿈과 희망을 줍니다. :)
[7일 이후 보팅] 모이또가 좋은 글을 응원합니다.
이 댓글에 보팅하면 @hanyeol님께 자동으로 보상이 됩니다.
보팅으로 좋은 글을 응원해주세요~!
1번의 경우 사용자가 소유중인 디바이스인지 확인하는것도 중요할것 같습니다.
모이또 파이팅입니다~
아, 좋은 의견입니다. 고민해보겠습니다~! 오늘도 개발자분들, 화이팅입니다!
Congratulations @hanyeol! You have completed some achievement on Steemit and have been rewarded with new badge(s) :
Award for the number of upvotes
Click on any badge to view your own Board of Honor on SteemitBoard.
To support your work, I also upvoted your post!
For more information about SteemitBoard, click here
If you no longer want to receive notifications, reply to this comment with the word
STOP
꾸욱 들렸다가요
들려주셔서 감사합니다~ :)
응원합니다. 선 보팅 후 깃헙!!
현재 모바일로 보기 좀 그래서 그냥 저냥 쓰고 있었는데
기대되네요!
기대에 꼭 부응하도록 달려보겠습니다~!
스팀잇에 능력자들이 정말 많네요! 기대하겠습니다!
스팀잇에 오면 없던 능력도 생기는 거 아니겠습니까~! :)
ㅋㅋㅋ그러게요. 스팀잇의 순기능인 듯. 저도 스팀잇 시작하고 이러다 웹툰도 그리게 될지도ㅎㅎ 저도 시간될 때 스팀잇 API좀 연구해서 간단한 서비스 만들어보고 싶은데 그냥 공식 API reference보면 되는건가요? 아니면 혹시 좋은 자료 있으면 좀 소개해주세요. 감사합니다.
혹시 어떤 서비스를 만들고 싶으신지 여쭤봐도 될까요?
사실 아직 정한 것은 없고 그냥 웹서비스에 보고 싶은 정보들 모아서 보여주는 정도로 이것저것 해보면 좋지 않을까 생각만 하고 있습니다. 꼭 웹서비스 아니어도 되고 데이터를 가지고 연구도 좀 해보고 싶기도 해서요. 데이터쪽은 이제는 합리적인 가격에 유료화된 SQL DB서비스가 있는 것 같더라고요.
스팀 API는 공식 레퍼런스를 보시면 되긴 하는데요, 내용은 매우 부실합니다. 차라리 시작점은 이 문서가 좋습니다. 바로 따라해볼 수 있거든요.
감사합니다. 네 안그래도 공식레퍼런스가 별로라는 말을 많이 들어서요ㅎㅎ 정말 바로 실행해볼 수 있는거 보니 좋네요.
5월 다시 파이팅해요!
호출에 감사드립니다!
짱짱맨 호출에 응해주시다니~! 오치님도 화이팅입니다. 5월 중에 얼굴 한번 뵈어요~
pairplay 가 kr-dev 컨텐츠를 응원합니다! :)