젠포트 보안 문제...가 있지만 그래도 가장 쓸만한 백테스팅 툴

hur-kyuh-leez·2021년 10월 13일
0

2022 Feb 추가노트: 몇개월간 사용 해보니...우연의 일치와 여러 이유가 있겠지만 실전 포트로 돌린 것들이 결국 알파가 줄어든다. 젠포트는 쉽게 사용 가능 하지만 쉽게 알파도 줄어 든다. '예전에는 이랬구나' 이런 식의 백테스트 용도로만 쓰고 실전에서는 쓰지 않겠다.


보안 문제를 쓰기에 앞써 제 벨로그에 "아쉽다"라는 표현을 한 글들은 모두 제가 최소한 관심이 있고 좋아하는 서비스들 입니다. 제가 좋아한다는 말은 그 서비스가 문제를 개선하여 앞으로 지속 되고 저뿐만이 아니라 많은 사람들에게 더 많은 효용을 가져다 줬으면 하는 바램에 글을 남기는 것 입니다.

젠포트의 고유의 문제점이 있어 완벽하지는 않은 백테스팅 플랫폼이지만, 최소 국내에서는 가장 쓸만 하고, 국외 플랫폼을 통틀어 가장 쓰기 쉬운 플랫폼 입니다. 제가 가지고 있는 데이터에 한에서 테스트를 해본 결과 꽤나 비슷하게 결과가 나옵니다. 이는 자신만의 DB가 있으며 백테스팅툴을 가지고 있는 분들은 비슷한 얘기를 하십니다(검색하다 보면 지적하는게 비슷합니다). 하지만 완벽하게 똑같이 나오지는 않습니다. 가령 거래정지 후 감자 된 종목은 포트폴리오 수익률을 실제와 완전 다르게 합니다.
하자가 있다고 해서 안좋은 플랫폼이라는 것은 절대 아닙니다. 오히려 젠포트가 다른 백테스팅 플랫폼들이 하지 못하는 것들도 하고 있습니다. 바로 유져에게 어떤 팩터들이 중요하지 직접적으로 알려주고 있습니다. 퀀토피안이나 퀀트커넥트 같은 경우 코딩을 자유롭게 할 수 있어 굉장히 자유도가 높습니다. 그러나 그 이면에는 어떤 팩터들이 해당 금융시장에 먹히는지 찾기가 매우 어렵습니다. 반대로 젠포트는 대놓고 알려줍니다. 가장 명확한 예가 가장 쉬우면서 잘먹히는 마켓타이밍 팩터를 기본 선택으로 할 수 있게 유도 합니다. 이뿐만이 아니라 대부분의 젠포트만의 고유의 팩터들은 현시장에 유효한 팩터들 입니다. 이처럼 중요한 팩터를 넣어 두어 가이드를 해준다는 점에서 해외 플랫폼과 큰 차이가 있습니다.

서두가 길었으나, 오늘의 주제로 넘어가 보려고 합니다.
바로 보안문제 입니다.
뉴지스탁(젠포트)는 2020년 10월경에 해킹을 당했습니다.
악성코드로 인한 데이터 탈취로 보입니다.

그리고 분명 보안 강화에 최우선적으로 투자하고 관리할 것이라고 약속을 하였습니다. 그러나 제가 생각하는 보안 레벨까지 올라오지는 못한 거 같습니다. 그리고 자세한 정보를 빠뜨렸습니다. 바로 악성코드가 언제부터 심어져 있었는지와 단순 개인정보 탈취인데 몇분만이 아니라 지속적으로 서버에 악성코드를 심어두었는지에 대한 의문 입니다. 일반적인 개인정보 탈취 였으면 잠깐 심었다 뺐으면 됐는데 해커는 그러지 않고 놓아두었습니다. 다른말로 추가적으로 드러오는 정보가 더 중요하다고 판단 한 거 같습니다.

그러면 '그 추가적인 정보는 무엇일까?'라고 생각하며 사이트 이곳저곳을 둘러보았던 중 한가지 허점을 알 수 있었습니다. 바로 api로 백앤드 데이터를 접근하는 방식에서 보안이 뚫려 있는 걸 확인 하였습니다.

먼저 차이점을 보여드리기 앞써 보안이 상대적으로 나은 업비트 사이트 방식을 알아보겠습니다.
자신의 과거 거래내역을 가져오기 위해서 콜되는 api 입니다.
https://ccx.upbit.com/api/v1/investments/events?limit=30&from=2021-09-14T01%3A04%3A25.678%2B09%3A00&to=2021-10-14T01%3A04%3A25.678%2B09%3A00
보시면 아시겠지만 중요한 개인정보가 포함되지 않습니다. 그리고 해당 링크를 클릭해도 백앤드 데이터에 접근이 불가능 합니다.

{"error":{"name":"V1::Exceptions::NoAuthorizationToken","message":"로그인이 필요합니다.","dialog":"client"}}

반대로 뉴지스탁(젠포트) 방식을 보시게 되면 경악을 하실겁니다.
https://api.newsystock.com/v1/GenPort/Main/GetBackTestInfo?PortUID=암호화도되지않은포트넘버&MemberUID=암호화된아이디
두가지 굉장히 민감한 데이터를 인자로 넣어 요청을 합니다. 왜 민감하냐면 젠포트의 핵심인 "자신만의 알고리즘"에 쉽게 접근하게 만들어기 때문 입니다. 두가지 데이터만 가지고 있다면 힘들게 만든 전략을 쉽게 남이 탈취가 가능하다는 것 입니다.

탈취 될 수 있는 데이터 예)

{"result":"OK","msg":"","data":{"port":{"nsPortUID":"111111","nsUseType":"KOR","nsMemberUID":11111,"nsPortType":"B","nsName":"이거안되는겁니다 예시로만 ","nsDescription":"","nsStartDate":"20081006","nsEndDate":"20211006","nsServerInfoUID":11111,"nsUnivGroup":["KF-ALL","KT-ALL","QFL","QFM","QTM","QTS"],"nsClassify":["12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","77","78","79","80","81","82","83","84","85","86","87","88","90","91","92","93","94","95","96","97","99"],"nsIntGroup":[],"nsThemeGroup":[],"nsBanGroup":[],"nsBuyCondExp":"A and B and C and D and E and F","nsSellCondExp":"","nsCopyHistoryUID":9999,"AUTH":null,"ORG_AUTH":null,"sell_conditions":[],"buy_conditions":[{"nsExpr":"{KOSPI_MT_or(3_5_10)} + {KOSDAQ_MT_or(3_5_10)} ","nsOperator":"\u003d","nsSeqNo":0,"nsValue":2.0},{"nsExpr":"최고값({V_KOSPI_고가},{3일})","nsOperator":"\u003c","nsSeqNo":1,"nsValue":25.0},{"nsExpr":"{일목균형표선행스팬1}-{일목균형표선행스팬2}","nsOperator":"\u003e","nsSeqNo":2,"nsValue":0.0},{"nsExpr":"{종가}-{일목균형표선행스팬1}","nsOperator":"\u003e","nsSeqNo":3,"nsValue":0.0},{"nsExpr":"{KOSDAQ지수_종가}/과거값(\u0027이동평균({KOSDAQ지수_종가},{4일})\u0027,{1일})","nsOperator":"\u003e\u003d","nsSeqNo":4,"nsValue":1.0},{"nsExpr":"변화율_기간({OBV},{10일})","nsOperator":"\u003e","nsSeqNo":5,"nsValue":0.0}],"nsCompatibleType":"NORMAL","isViewAuthCondition":true,"set":{"propAAType":"1.0","propTimeBuyStart":"0900","propUseManagement":"N","propBaseOrder2Use":"N","propBuyPriceVal":"-1.5","propBuyPriceType":"PRE_CLOSEPRICE","propLogicSellVal":"0","propBuyPriceDivide":"{\"divide\":[]}","propAAStockRate":"60.0","propReBuyCheckDay":"0","propHoldDateSellDivide":"{\"divide\":[]}","propAALastETFBuyDate":"","propTimeSellStart":"0900","propCutSellRate":"20","propBaseOrderColumn2":"{종합점수}","propMaxBuyAmountPerStock":"0","propTimeSellEnd":"1530","propHoldDateSellVal":"0","propMinHoldDate":"0","propStartAsset":"10000000","propBreakThroughDirection":"UP","propTargetSellRate":"5","propBaseOrderDir":"DESC","propBuyPriceCondition":"","propLogicSellType":"PRE_CLOSEPRICE","propAAReBalancingPhase":"START","propBuyWeightPerStock":"10","propMaxHoldDate":"1","propLogicSellDivide":"{\"divide\":[]}","propMaxBuyType":"MAX","propSlippage":"0","propFeeRate":"0.001","propTargetSellType":"BUYPRICE","propAA":"N","propBaseOrderColumn":"이격도( {5일} )","propAABuyRate":"5.0","propTraillingStop":"N","propLogicSellClosePrice":"N","propCutSellType":"BUYPRICE","propHoldDateSellType":"PRE_CLOSEPRICE","propBreakThrough":"0.0","propCompatibleType":"NORMAL","propMaxBuyCountPerDay":"0","propMaxBuyCount":"20","propBaseOrderDir2":"DESC","propAAReBalancingCycle":"3.0","propBreakThroughType":"NO","propUseSupervision":"N","propAAETFRate":"30.0","propTimeBuyEnd":"1530"},"nsClusterList":null}},"totalCount":1}

(위 정보는 예시로 쓰기 위하여 중요한 개인정보는 바꿨습니다. 그리고 당연히 실제로는 사용할 수 없는 전략 입니다.)

물론 두번째 데이터는 암호화가 되어 있습니다. 그러나 암호화는 로그인/로그아웃 기준으로 변하는게 아니라 1일 주기로 해쉬값을 바꾸기 때문에 업비트에 비해 보안이 허술 합니다. 아무래도 실제 매매를 돕는 젠트레이더라는 PC 프로그램 때문에 로그인 과정에 부터 업비트와 비슷하게는 할 수 없고 뉴지스탁 개발자팀에서 중요 정보가 담긴 요청 방식을 선택 하셨겠지만 더 좋은 방식이 분명 있으실 겁니다. "보안 강화에 최우선적으로 투자하고 관리할 것이라고 약속"을 주세요

ps.
어짜피 젠포트 유져가 직접 피해를 증명하기는 어려울테지만, 의도적으로 악성코드가 심어진날을 정확히 밝히지 않으신 점과 consideration(보상)으로 미래에 있을 법적 충돌도 미리 피하시고 추가적으로 유져들이 충분히 해택을 납득할만한 금액으로 해결하신 건 박수 받을만한 좋은 경영 선택이라고 생각이 듭니다.

그러나 외부에 내부정보를 알릴 때는 조금 더 기술적인 결함이 없는지 확인 할 필요는 있는 거 같습니다. 해쉬된 비밀번호이 탈취가 가능 했다면, 해쉬된 아이디 탈취는 매우 손 쉬웠을 것으로 보입니다.

profile
벨로그에 생각을 임시로 저장합니다. 틀린건 틀렸다고 해주세요 :) 그래야 논리 학습이 강화됩니다.

0개의 댓글