레이블이 OSI인 게시물을 표시합니다. 모든 게시물 표시
레이블이 OSI인 게시물을 표시합니다. 모든 게시물 표시

2018-03-04

2018년 9번째 주

 이 포스팅은 그냥 지난 한 주간 읽었던 것들을 정리하는 포스트입니다. 그냥 예전에 봤던 글 중 나중에 필요한데 뭐였는지 기억 안 나는 글들이 있어서 쓰기 시작했습니다.
 보통 하는 일과 관련된 글들이 올라오겠지만 딱히 정해둔 주제는 없고, 그때그때 관심 있었던 것을 읽었기 때문에 지난주에 쓰인 글일 수도 있고 몇 년 전에 쓰인 글일 수도 있습니다.

Lifetime Safety: Preventing Leaks and Dangling

 Herb Sutter와 Neil MacIntosh가 쓴 C++에서 memory leakdangling pointer를 어떻게 없앨 수 있는지에 관한 글이다. 일반적으로 C++의 포인터는 매우 강력하기 때문에, memory leak이나 dangling pointer를 없애기 위해서 C++의 기능을 일부 제한하거나 새로운 문법을 추가하거나 한다. 하지만 이 글에서는 언어를 바꾸지 않으면서 런타임 오버헤드 없이 컴파일 타임에 분석할 수 있는 알고리즘을 제시한다.
 특히 이 알고리즘은 프로그램 전체를 분석하는 것이 아니라 함수 단위, 정확히는 블록 단위로 적용할 수 있고, 변수 재사용 등 많은 스타일 가이드에서 권하지 않지만 실제로는 많이 사용되는 패턴들에 대해서도 고려돼있기 때문에 레거시 코드에 적용하기도 좋다.
 기계적인 작업이기 때문에 툴을 만드는 것이 가장 좋을 것이다. 하지만 툴을 만들 여유가 없더라도 포인터나 레퍼런스를 어떻게 써야 안전한지 보여주는 좋은 글이기 때문에 일단 읽어보는 것을 추천한다.

GitHub DDoS 공격당함

 지난 2018년 2월 28일, GitHubDistributed Denial-of-Service(a.k.a. DDoS) 공격을 당해 약 10분 정도 서비스가 멈췄었다. 이 공격은 memcached를 이용한 공격으로 중국의 0kee team이 찾은 Deluge라는 기법을 이용한 공격이었다.
 Deluge는 다른 서버에 설치된 memcached에 데이터를 요청할 때 source IP를 목표가 되는 서버의 IP로 수정하여 보내, memcached 서버가 목표가 된 서버로 데이터를 보내게 만드는 공격이다.
 이런 부류의 공격을 IP spoofing이라고 하는데, 이는 Internet protocol(a.k.a. IP)OSI 7 layer에서 말하는 session layer에 관한 부분이 없기 때문에 생기는 근본적인 취약점을 이용한 것이기 때문에, 네트워크 프로토콜을 IP 위에 올린다면, 프로토콜을 작성하는 차원에서 세션 처리를 신경 쓰지 않았다면 근본적으로 막을 방법은 없다.
 IP spoofing 자체는 흔하게 사용되는 공격법이지만 memcached를 사용하는 Deluge는 그중에서도 큰 획을 그었다. 단순히 GitHub을 공격했기 때문이 아니라 적은 패킷으로 많은 데이터를 공격하게 할 수 있기 때문이다. 이 비율을 bandwidth amplification factor라고 하는데 Deluge는 지금까지 알려진 IP spoofing 공격 중에서 가장 높다.

2016-03-10

OSI 모델은 무엇인가

 OSI 모델은 추상화를 위해 프로토콜을 여러 계층의 layer로 나누고, 각 layer에서 자신이 책임진 일만 하도록 설계한 네트워크 모델이다. 각 layer는 완전히 독립되어 있으며, 각 layer에서 수행해야 하는 일만 제대로 된다면 그 구현은 다른 구현으로 대체 될 수 있도록 설계되어야 한다.

OSI 7 layer

 OSI layer는 보통 7계층으로 나누어지기 때문에 OSI 7 layer라고 불리기도 한다. 각 layer의 이름은 가장 아래부터 physical layer, data link layer, network layer, transport layer, session layer, presentation layer, application layer다. 이를 다시 크게 둘로 나누어서 network layer까지의 아래 3개 layer는 media layer라고 하고, transport layer부터 위의 4개 layer를 host layer라고 한다. media layer는 네트워크상에서 원하는 머신을 찾아 데이터를 보내는 역할을 하고, host layer는 전송된 데이터를 안전하게 사용하는 방법에 대한 역할을 한다.

 그러면 이제부터 각 layer에 대해 자세한 설명을 할 것인데 명심해야 할 것은 어떤 네트워크 프로토콜을 만들 때 OSI 모델을 지키는 것이 필수적인 것은 아니라는 것이다. 실제로 많이 사용되는 네트워크 프로토콜 중에서도 완벽하게 OSI의 원칙에 따라 설계된 프로토콜도 거의 없고, 7개 계층을 전부 구현하여 사용하는 것도 본 적이 없다. 그냥 네트워크 프로토콜은 이러한 역할이 필요하고, 그것은 이러한 순서로 지켜지는 게 안전하다는 가이드 정도로 생각하는 것이 좋다.

physical layer

 우선 가장 아래 계층은 physical layer다. physical layer에서는 전달 매체를 통해 전달된 신호를 어떻게 0과 1로 바꾸는지를 담당한다. 데이터의 전달 매체에 따라서 0과 1이 반드시 bit일 필요도 없고, 사실 전기 신호일 필요도 없다. 정말 다양한 방법으로 구현될 수 있지만 보통은 프로그래머가 신경 쓸 필요 없는 수준의 이야기다.

data link layer

 두 번째 계층은 data link layer다. data link layer에서 전송되는 data의 단위는 frame이라고 부르는데, 이 계층에서는 오류 없는 온전한 frame이 전달되는 것을 보장하거나 데이터를 전달할 매체에 접근하는 것을 컨트롤 해주는 계층이다. 다만 최종목적지까지 전달되는 것은 아니고, 로컬 네트워크 내에서만 전달해주거나, 로컬 네트워크 사이를 연결해주는 역할만 한다. 오류가 없는 것을 보장하기 위해 에러를 감지하거나 고칠 수 있는 데이터를 프레임에 추가하기도 한다.

network layer

 세 번째 계층은 network layer다. network layer에서 다루는 data의 단위는 packet이다. 일반적으로 frame은 packet을 감싼 1 : 1 관계지만, 꼭 그렇다고 할 수는 없다. 다양한 이유로 data link layer에서 packet들을 모아서 하나의 frame으로 만들거나, 하나의 packet을 쪼개서 여러 개의 frame으로 만들거나 한다. 이 계층에서는 data가 목적지까지 도착하도록 routing 해준다. 하지만 목적지까지 제대로 도착한다거나, 순서대로 도착하는 것을 보장해주지는 않는다.

transport layer

 네 번째 계층은 transport layer다. transport layer는 최종 노드까지의 안전한 통신을 보장해서 이다음 layer부터는 data의 무결성을 신경 쓰지 않을 수 있도록 해준다. 에러 검출이나 order의 보장 등을 할 지 말지에 따라서 TP0부터 TP4까지 4개의 class로 분류된다.

session layer

 다섯 번째 계층은 session layer다. 두 node 사이의 인증을 해주거나, 연결이 끊어졌을 때 다시 연결을 해주거나 하는 것을 담당한다. SSH protocol처럼 지속적인 연결이 보장되어야 하는 프로토콜에서 사용된다.

presentation layer

 여섯 번째 계층은 presentation layer다. 교환되는 정보의 형태를 결정한다. endian을 결정하기도 하고, 전송할 data field의 크기를 결정하는 등 전송될 데이터의 모양을 만든다. 하지만 현실적으로 별도의 프로토콜 레이어로 구현되지 않고, 서버와 클라이언트 간의 암묵적인 약속으로 보장해준다.

application layer

 일곱 번째 계층은 application layer다. 이 계층의 프로토콜은 사용자가 네트워크를 이용해 실제로 하고자 하던 것. 즉, file을 주고받는다거나, 명령을 보낸다거나 하는 내용을 명시한다.