왜 당신의 코드는 도형입니까

도형 구조 및 보안 코드 분석에서의 사용


그림 구조는 여러 가지 데이터의 자연적인 표시이다.그것들은 대상 간의 관계를 나타내는 좋은 방법이다. 예를 들어 소셜 미디어 사이트의 사용자 간의 관계, 그리고 서로 다른 위치 간의 거리를 나타낸다.
오늘 우리는 도형과 그것들이 어떻게 안전 코드 분석에 사용되는지 연구할 것이다.그리고 우리는 도형 분석 코드의 빈틈을 어떻게 사용하는지 깊이 있게 연구할 것이다.

다이어그램 소개


도형 구조와 도형 데이터베이스에 대해 들어보셨을 수도 있습니다.수학에서 그림은 이 노드를 연결하는 노드와 변이다.이 그림처럼

노드는 대상을 대표하고, 연결 대상의 가장자리는 그들 사이의 관계를 대표한다.예를 들어 소셜미디어 사이트에서 사용자 간의 관계를 그래픽으로 표시하면 다음과 같습니다.

모서리를 정위할 수 있으며, 모서리의 특성을 나타내는 값(예: 모서리와 연관된 레이블 또는 숫자)을 각 모서리에 지정할 수 있습니다.도형 구조를 사용하면 우리는 서로 다른 대상 간의 복잡한 관계와 상호작용을 나타낼 수 있다.예를 들어 우리는 어떤 사용자가 사이트에서 다른 사용자를 막는지 나타낼 수 있다.

이것이 바로 도형 데이터베이스의 작업 원리다.도면에 객체와 해당 관계를 표시하여 도면 조회 및 관련 모서리 추적을 통해 사용자 C를 차단하는 사용자가 얼마나 됩니까?사용자 B의 친구는 몇 명입니까?

도형으로 코드를 표시하다


코드의 관계도 도형으로 표시할 수 있다.예를 들어 추상 문법 트리(AST)는 프로그램 코드의 문법 구조를 나타내는 도형이다.

다음은 Euclidean algorithm에서 얻은 https://en.wikipedia.org/wiki/Abstract_syntax_tree 코드의 추상적인 문법 트리입니다.
이 위조 코드는 유클리드 알고리즘의 논리적 절차를 대표한다.
**while** b ≠ 0
  **if** a > b
    a := a − b
  **else**
    b := b − a
**return** a
이 그림은 프로그램 코드를 도형 구조로 변환하고 문법의 각 요소를 보존하는 것을 볼 수 있습니다.
다른 코드의 도형 표시도 있다.CFG(컨트롤 스트림 맵)는 코드의 실행 순서와 코드를 실행하는 데 필요한 조건을 나타냅니다.CFG에서 각 노드는 프로그램의 명령을 나타내고, 모서리는 프로그램의 제어 흐름을 나타낸다.CFGs를 사용하면 실행 과정에서 다른 점에서 어떤 명령을 호출할 수 있는지 도형을 훑어볼 수 있습니다.여기에 두 개의 예시 CFG가 있는데 각각 (a)if-then-else 구조와 (b)while 순환을 나타낸다.
JMP EAX에서 발췌 — 자신의 작품, BY-SA 4.0 베끼기https://commons.wikimedia.org/w/index.php?curid=34222288
코드의 또 다른 유용한 그래픽 표현은 프로그램 의존도(PDG)입니다.PDG는 코드의 데이터 및 제어 종속성을 나타냅니다.PDG에서 데이터는 모서리에 의존하여 데이터의 영향을 지정하고 모서리에 의존하여 술어를 지정하는 것이 다른 노드에 미치는 영향을 제어한다.이 경우 술어는 TRUE 또는 FALSE를 계산하는 논리적 표현식으로, 실행 경로를 나타내는 데 사용됩니다.이 코드를 보십시오:
void example(){
  int x = 1;
  int y = 2;
  if (x > 1){
    int z = x + y;
    print(z);
  }
}
다음 PDG로 표시할 수 있습니다.이 그림에서 D(변수)는 변수의 데이터 의존 노드를 나타내고 C(술어)는 술어의 제어 의존 노드를 나타낸다.알 수 있듯이 z의 정수 성명은 x>1에 의존하고 x와 y의 값에 의존한다.

PDG를 사용하면 데이터가 코드에서 어떻게 전송되는지, 그리고 특정한 데이터 세그먼트가 특정한 문장에 도달할 수 있는지 볼 수 있다.
보시다시피 코드의 서로 다른 도형은 서로 다른 목적을 위해 최적화되었다.많은 보안 분석 도구들이 코드의 관계를 그리기 위해 이 그림의 하나 또는 조합을 사용한다.예를 들어 PDG는 보안 목적으로 공격자가 제어하는 데이터가 보안 민감 기능으로 어떻게 전송되는지, 그리고 그 과정에서 데이터를 검증하거나 변환해야 하는지 확인하는 데 도움을 줄 수 있다.
그러나 서로 다른 표현을 결합시키면 코드의 도형 표시의 진정한 위력이 나타난다.AST, CFG와 PDG는 모두 서로 다른 각도에서 같은 코드를 나타내는데 프로그램의 일부 속성은 한 표현법에서 다른 표현법보다 쉽게 표현된다.프로그램의 서로 다른 속성을 대표하는 그림을 조합하면 하나의 주도를 구축하여 서로 다른 투시도를 한데 합쳐 그것들을 모두 고려할 수 있다.이것이 바로 코드 속성 그래프(CPG)입니다.CPG를 사용하면 동일한 프로그램의 복잡한 동작을 하나의 도면에서 표현할 수 있습니다.
원작인 에서 코드 속성도에 대한 설명은 추상적인 문법 트리, 제어 흐름도와 프로그램 의존도를 합쳐서 조회 코드의 표시를 얻었다[1].

도형 자동화 보안 코드 분석 사용


일단 우리가 프로그램의 행위를 나타내는 그림이 생기면 코드의 모델은 보통 이 그림의 모델로 나타낼 수 있다.이것은 우리가 조회 도형을 통해 원본 코드에서 검색 모드를 찾을 수 있다는 것을 의미한다.
빈틈은 보통 코드에서 공통된 패턴이 있다.예를 들어, XXE 취약점의 피쳐 코드는 DTD 또는 외부 솔리드를 비활성화하지 않고 사용자가 제공한 XML을 파서에 전달합니다.(XXEs 정보hereCPG를 사용하면 코드에서 이러한 정확한 패턴을 찾을 수 있습니다.이것은 CPG를 직관적이고 강력한 빈틈 발견 엔진으로 만들었다. 왜냐하면 모든 빈틈은 하나의 도형만 범람하기 때문이다.
취약점을 나타내는 패턴을 찾기 위한 쿼리 CPG의 예를 살펴보겠습니다.Joernhttps://joern.io/은 CPG를 이용한 소스 코드 분석을 위한 소스 오픈 툴입니다.CPG가 코드의 빈틈을 찾는 논리 과정을 간소화하는 방법을 알아보기 위해 Joern 조회를 배워봅시다.
예를 들어 Joern을 사용하여 Java 응용 프로그램의 명령 주입 빈틈을 감지하는 것은 다음과 같다.이러한 Joern shell 질의에서 먼저 도면에 HttpServletRequest 이름이 포함된 모든 식별자가 프로그램에서 사용자가 제어하는 HTTP 매개 변수를 찾아야 합니다.그리고 exec나 eval 방법에 대한 호출을 찾았습니다. 이 방법은 자바에서 시스템 명령을 실행하는 함수입니다.마지막으로, 우리는 사용자에게 입력 매개 변수로 위험 함수에 도달할 수 있는지 물었다.이 세 가지 조회는 임의의 시스템 명령을 실행하는 함수에 사용자 입력이 전달되었는지 확인합니다.
> def source = cpg.identifier.typeFullName(".*HttpServletRequest.*")

> def sink = cpg.call("exec|eval").argument

> sink.reachableBy(source)
다음은 반사 XSS를 나타내는 모드를 검색합니다.여기서 첫 번째 질의는 사용자가 제공한 URL 매개 변수를 검색합니다.두 번째 질의 검색 프로그램은 HTTP 응답 위치로 데이터를 인쇄합니다.마지막으로 print 문에 URL 매개 변수가 전달되었는지 확인합니다.이 세 질의는 HTTP 응답에 URL 입력 매개 변수가 반영되는지 여부를 결정합니다. 이것은 XSS의 빈틈을 반영하는 표지입니다.
> def source = cpg.call.name("getParameter")

> def sink = cpg.call(".*print.*").where(x => x.reachableBy(cpg.identifier.typeFullName(".*HttpServletRequest.*"))).argument

> sink.reachableBy(source)
ShiftLeft 코드 분석 플랫폼의 기반입니다.우리는 서로 다른 언어의 코드를 CPG로 번역할 수 있는 도구를 만들었다.그리고 CPG를 사용하면 우리는 당신의 코드 라이브러리를 훑어보고 공격자가 접근할 수 있는 빈틈을 정확하게 찾아 오보를 최대한 줄이고 스캔 시간을 단축할 수 있습니다.CPG의 배경, 발명 및 기술에 대한 자세한 내용은 Fabian Yamaguchi 박사의 게시물https://blog.shiftleft.io/semantic-code-property-graphs-and-security-profiles-b3b5933517c1을 참조하십시오.
빈번한 보안 검색을 현재의 빠른 소프트웨어 개발 과정에 통합하는 것은 결코 불가능하지 않다.CPG를 코드를 분석하는 방법으로 사용하는 것은 테스트에서 더욱 좋은 속도, 정확성과 전면성을 의미한다.Shift Left 보안 플랫폼 Shift Left CORE에 대한 더 많은 정보를 알고 싶으시면 저희here를 방문하십시오.
읽어주셔서 감사합니다!당신을 위해 보안 소프트웨어를 개발하는 가장 도전적인 부분은 무엇입니까?알고 싶어요.마음대로 트위터에 접속하세요.

도구책


[1] Modeling and discovering vulnerabilities with code property graph. Fabian Yamaguchi, Nico Golde, Daniel Arp and Konrad Rieck. Proc. of 35th IEEE Symposium on Security and Privacy (S&P), 2014

좋은 웹페이지 즐겨찾기