안경잡이개발자

728x90
반응형

  하나의 프로그램의 취약점을 찾는 방법에는 다양한 기법이 있다. 기본적으로 프로그램은 입력(input)을 받아서 출력(output)을 내보내는 방식으로 동직하는데, 퍼징(fuzzing)이란 자동적으로 입력을 생성하여 반복적으로 프로그램에 넣어보는 것이다. 기본적으로 퍼저(fuzzer)는 입력을 만들어 내는데, 입력을 반복적으로 변형(mutating)하며 프로그램에 넣어보는 소프트웨어를 의미한다. 실질적인 측면에서 퍼징은 크래시(crash)를 만들기 위한 도구로 쓰이는 경우가 많다.

 

  퍼징을 더욱 더 엄밀하게 정의하면 다음과 같다.

 

  "Fuzzing refers to a process of repeatedly running a program with generated inputs to test if a program violates a correctness policy."

 

  카이스트(KAIST) 차상길 교수님의 자료에서는 다음과 같은 그림이 있다.

 

 

  퍼저의 종류는 크게 세 가지로 구분할 수 있다.

 

1. Black-box Fuzzing: 프로그램의 내부적를 알지 못하고, 입력에 따른 출력만 확인이 가능한 상태에서 퍼징을 하는 것이다.

 

2. White-box Fuzzing: 프로그램의 내부를 알기 때문에, 프로그램 내부의 모든 possible path를 검사할 수 있도록 조건에 맞는 입력을 넣는 방식으로 퍼징을 하는 것이다. 그래서 symbolic execution을 같이 하면서 입력값을 mutating하여 퍼징을 진행할 수 있다.

 

3. Grey-box Fuzzing: 프로그램 내부의 일부(some information)를 아는 상황에서 퍼징을 하는 것을 의미한다.

 

  굉장히 유명한 퍼저(fuzzer)로는 AFL이 있다. AFL은 가장 대표적인 Grey-box 방식의 fuzzer으로, 아직까지도 state-of-the-art인 baseline으로 제안되고 있다. 이러한 AFL로부터 매우 많은 fuzzer들이 영향을 받아 제안되었다.

728x90
반응형

728x90
반응형

  블록체인(blockchain) 분야에는 다양한 보안 이슈가 존재한다.

 

1. INFRASTRUCTURE ATTACK

 

  이 분야에서 가장 유명한 공격은 51% 공격(attack)이다. 이는 네트워크에서의 컴퓨팅 파워의 50% 이상을 차지하는 집단이 있다면, 전체 네트워크를 컨트롤할 수 있다는 것을 의미한다. 또한 가상화폐의 trade를 막기 위한 DDoS 공격 유형도 사용될 수 있다. 그리고 시빌(Sybil) 공격은 여러 개의 virtual identity를 만드는 유형을 의미한다. 예를 들어 비트코인의 경우 다수의 지갑을 만들어 실제로는 혼자이지만, 다수의 사람인 척 흉내를 낼 수 있다. 이러한 공격이 이클립스(eclipse) 공격으로 연결될 수 있는데, 특정한 노드와 연결된 노드들을 전부 attack node로 채워버려 하나의 노드를 고립된(isolated) 상태로 만들 수 있다.

 

  또한 mining pool을 공격(attack)하는 유형도 존재한다. 대표적으로 FC 2014에서 발표된 Selfish Mining이 있다. 채굴(mining) 자체는 경쟁적으로 이루어지며, 자신이 속한 체인(chain)의 길이가 가장 길어야 실질적인 이득을 볼 수 있을 것이다. Selfish Mining의 기본적인 아이디어는 nonce 값을 찾은 뒤에 바로 공표하지 않고, 그다음 블록을 미리 만들고 있는 것이다. 나중에 honest miner가 블록을 발표했을 때, 공격자가 한꺼번에 2~3개의 블록을 공표하여 자신의 체인이 가장 길어지도록 한다. 즉, honest miner의 computation power를 wasted 하도록 만드는 것이다.

 

2. APPLICATION ATTACK

 

  먼저 이중 지불(double spending) 공격이 있다. 말 그대로 동일한 돈을 여러 노드에 송금하는 공격이다. 내가 1 BTC를 가지고 있는 상황에서, A와 B에게 모두 1 BTC를 보내는 공격 유형이다. 이중 지불을 막기 위한 기본적인 방어 기법은 해당 transaction 이후에 최소한 6개의 연달아 생성된 블록(block)이 되었을 때 인정하도록 하면 된다.

 

  또한 스마트 컨트랙트(smart contract) 취약점을 공격하는 유형도 존재한다. 실제로 DAO 토큰의 사례가 자주 언급되는데, 스마트 컨트랙트를 작성할 때의 실수로 문제가 발생한 사례이다. 나아가 자동화 도구를 개발하여 이더리움의 스마트 컨트랙트 취약점을 찾도록 하는 연구도 많이 진행되고 있다. 대표적인 문제점인 reentrancy, unchecked send와 같은 다양한 취약점이 존재하는지 개별 스마트 컨트랙트에 대하여 검사하도록 할 수 있다. 대표적인 메서드가 ZEUS이다.

728x90
반응형

728x90
반응형

  기본적으로 다양한 데이터가 있는 DB에 대하여 쿼리(query)를 날려서, 결과를 얻을 수 있다. 공격자는 적당한 쿼리를 날려서 특정한 인물의 데이터를 특정할 수 있다. 이는 개인 정보(Privacy)를 알아내는 공격으로 볼 수 있다.

 

  예를 들어 특정한 마을의 의료 정보 DB가 있을 때, DB 상으로 당뇨에 걸린 사람 중에서 나이가 75살인 여성이 있다고 해보자. 하지만 이때 해당 마을에 70살 이상의 여성이 1명뿐이라면? 우리는 의료 정보 DB로부터 개인을 특정할 수 있고, 이로 인해 개인 정보가 침해될 수 있다.

 

  다른 예시로 학교 DB에 포함된 데이터에서의 평균 나이가 25살, 대부분의 전공이 컴퓨터 공학이라고 해보자. 이때 특정한 사람은 평균 나이의 2배에 해당하는 나이를 가지며, 대부분의 전공과 같은 전공을 가지며, 고급 아파트에 살고 있다는 정보를 알게 되었다고 해보자. 그러면 우리는 학교에서 컴퓨터 전공인 50살을 특정하여, 그 사람이 고급 아파트에 살고 있다는 사실을 알게 된다. 실제로 학교에서 50살인 사람의 수가 매우 희박하다고 하면, 우리는 어떤 사람을 특정할 수 있게 된다. 즉, 개인 정보 보호가 깨지게 된다.

 

  이러한 문제를 어떻게 해결할 수 있을까? 바로 Differential Privacy를 사용하면 된다. DP의 메인 아이디어는 간단하다. DB의 보안성이 떨어지는데, 그렇다고 암호화를 통해 해결할 수 있는 문제도 아니므로, 그냥 노이즈를 섞어버리는 것이다. 실제로 ACM CCS 2014에서 발표된 논문에 의하면 구글도 이러한 DP를 적용하여 개인정보 보호 문제를 해결하고 있다.

 

  아래 공식을 확인하자. 여기에서 A가 1에 가깝다는 말은 i라는 데이터를 넣었을 때나 넣지 않았을 때나 구분이 잘 안 된다는 말이다. 다만 A가 완전히 1의 값을 가지게 되면 한 명의 정보는 전체 DB에 아무런 영향을 미치지 못하므로, 사실상 효용성(utility) 자체가 없다는 말이 된다. 반면에 A가 1보다 너무 커지면 한 명의 정보가 DB에서 빠지면 곧바로 티가 나기 때문에 개인 정보 침해 문제가 발생한다.

 

 

  그렇다면 A라는 값을 어떻게 설정해야 적당할까? 값이 너무 작으면 DB의 효용이 떨어지고, 값이 너무 크면 개인 정보가 유출될 수 있다. 그래서 통계적으로 적당한 값을 설정하면 되는 것이다. 그래서 결과를 내보낼 때 노이즈(noise)를 섞어서 내보내면 된다. 일반적으로 라플라스 노이즈(Laplacian noise)를 사용한다. 쿼리(query)에 대한 응답을 보낼 때마다 매번 새로운 노이즈를 섞어 보내면 된다. 마찬가지로 노이즈가 많이 섞이면 DB의 효용성을 떨어뜨리고, 노이즈가 적게 섞이면 개인 정보가 유출될 수 있는 것이다.

 

  또한 global sensitivity라는 용어를 이해할 필요가 있다. D1과 D2는 오직 한 사람(one person) 만큼의 차이가 있는 DB들을 의미한다. 이때 global sensitivity란 F(D1)와 F(D2)의 거리를 나타내기 위한 식을 의미한다.

 

 

  관련한 내용으로 Local Differential Privacy라는 분야도 존재한다. 이때는 각각의 사람(person)이 DB Service Provider를 믿을 수 없을 때 사용할 수 있는 개념이다. 예를 들어 "Have you ever used illegal drugs?"라는 질문에 대하여, 내가 응답한 내용이 DB에 담긴다고 하보자. 이때 단순히 진실만을 말하지는 말고, 내가 DB에 데이터를 넣기 전에 노이즈(noise)를 섞을 수 있다.

 

  예를 들어 응답하기 전에 동전을 던져서 앞면이 나왔을 때는 그냥 랜덤하게 Yes/No라고 답하고, 뒷면이 나왔을 때는 진실한 답변을 할 수 있다. 나중에 추적을 당했을 때를 고려하여, 이렇게 DB에 넣기 전에 로컬(local)에서 노이즈를 섞자는 아이디어를 합법적 부인이라고 표현한다. 쉽게 말하면 여기에서는 DB에 데이터 삽입할 때 노이즈가 섞인 데이터를 넣는 작업으로 볼 수 있다.

 

 

  마찬가지로 입실론(epsilon) 값을 설정하여 privacy-utility의 trade-off를 결정할 수 있다. 입실론 값이 작으면 두 분포를 구분할 수 없으므로 더욱 privacy하고, 입실론 값이 크면 두 분포를 쉽게 구분할 수 있으므로 덜 privacy 하다고 이해하면 된다.

 

 

  대표적으로 Google RAPPOR (CCS 2014)와 같은 논문이 이러한 아이디어를 이용한 방법을 제안하고 있다.

728x90
반응형