[C++] 따옴표로 묶지 않은 프로그램 경로(Unquoted Program Path)의 취약성 확인

6817 단어 C++취약성C#

하고 싶은 일



작성한 앱이 따옴표로 묶이지 않은 프로그램 경로(Unquoted Program Path) 취약점에 문제가 없는지 확인하고 싶습니다.

VisualStudio2019를 사용하여 C#/C++로 작성한 앱에 대해 취약점을 어떻게 확인해야 하나요? 조사해도 딱 나오지 않았기 때문에, 조사한 것을 메모.
(아마도 이것으로 이해하고 있다고 생각하지만, 잘못되면 지적해 주시면 고맙습니다)

따옴표로 묶여 있지 않은 프로그램 경로(Unquoted Program Path) 취약점이란?


CreateProcess 시리즈 함수를 사용하여 프로세스를 시작하려고 할 때 발생하는 취약점.CreateProcess 시리즈의 함수라고 하는 것은, 이하의 함수. →여기

CreateProcessA 함수의 페이지에, 그 취약성에 대해서, 이하와 같이 써 있다. →여기


이것은 예를 들어
c:\program files\sub dir\programname.exe

라는 exe를 CreateProcessA 함수로 시작하려고 할 때,
함수의 첫 번째 인수 "lpApplicationName"을 NULL로 설정하고 "lpCommandLine"으로c:\program files\sub dir\programname.exe 라는 문자열을 넣어 시작할 수 있지만,

이 경우 NG.cpp
if( !CreateProcessA( NULL,                                     // 1個目の引数lpApplicationName
                    "c:\program files\sub dir\programname.exe",// 2個目の引数lpCommandLine
                    NULL,NULL,FALSE,0,NULL,NULL,&si,&pi ) )

이 경우 CreateProcessA 함수는
  • c:\program.exe
  • c:\program files\sub.exe
  • c:\program files\sub dir\program.exe
  • c:\program files\sub dir\programname.exe

  • 라고 하는 차례로 해석을 해, (존재하지 않으면 다음, 또 존재하지 않으면 다음, 라고 하는 느낌으로) exe를 실행하려고 한다는 것이 CreateProcess 시리즈의 함수의 사양이므로,

    일반적으로 존재하지 않는 c:\program.exe라는 exe가 악성 프로그램으로 거기에 있다면 programname.exe를 호출하고 싶었던 구현자의 의도와 관계없이 c:\program.exe가 호출됩니다.

    라는 취약점.

    괜찮은 패턴 메모c:\program files\sub dir\programname.exe를 호출 할 때 동일한 CreateProcessA 함수를 사용하는 경우에도 첫 번째 인수 "lpApplicationName"을 NULL로 설정하지 않고 프로그램의 전체 경로를 넣고 호출 할 수 있습니다.

    이 경우 안전 .cpp
    if( !CreateProcessA("c:\program files\sub dir\programname.exe",   // 1個目の引数lpApplicationName
                        "/a /b",                                      // 2個目の引数lpCommandLine(exeへの引数になる)
                        NULL,NULL,FALSE,0,NULL,NULL,&si,&pi ) )
    

    이 경우 위와 같은 문제는 발생하지 않습니다.
    (Program.exe를 C 직하 등에 두고 시도한 결과 발생하지 않았다.)

    확인 방법



    확인① CreateProcess() 시리즈의 함수를 사용하고 있는지 확인



    CreateProcess() 시리즈의 함수 사양으로 위의 페이지에 쓰여진 것과 같은 Unquoted Program Path 취약점이 발생하기 때문에,
    CreateProcess() 시리즈 함수를 사용하고 있지 않으면 문제없다고 한다.
  • CreateProcess 매크로
  • CreateProcessA 함수
  • CreateProcessAsUserA 함수
  • CreateProcessAsUserW 함수
  • CreateProcessW 함수


  • 확인② CreateProcess()를 사용하고 있는 경우의 대처를 실시



    lpApplicationName을 NULL로 설정하고 lpCommandLine에 경로를 지정하여 프로세스를 시작하는 코드가 없는지 확인합니다.
    lpApplicationName을 NULL로 설정하지 않으면 OK.
    lpApplicationName을 NULL로 설정하고 lpCommandLine에서 경로를 지정하면 NG입니다.

    그 경우는 lpCommandLine의 패스의 지정의 캐릭터 라인을, """"로 묶어 준다.
    여기 페이지을 참조하십시오.

    확인③ VisualStudio2019의 정적 해석에서 취약성에 해당하는 지적이 나오지 않는 것을 확인한다



    정적 해석의 지적 「C6277」이 그 취약성에 해당하는 지적 때문에, 정적 해석을 실시해, C6277이 나오지 않는 것을 확인.

    C6277이란?
    htps : // / cs. 미 c 로소 ft. 코 m / 그럼 jp / cp / 코데 쿠아 ty / c6277?ゔ ぃ w = vs - 2019

    ※이번은, 하기의 설정으로 정적 해석을 실시. (C#은 상관 없다고 생각하지만 일단)


    PJ 종류
    정적 분석 규칙


    C++
    Microsoft 네이티브 권장 규칙

    C++/CLI
    Microsoft 혼합(C++/CLR) 권장 규칙

    C#
    Microsoft 관리 권장 규칙


    참조



    C6277(Unquoted Program Path에 대한 정적 해석 지적)
    htps : // / cs. mic로소 ft. 코 m / 그럼 jp / cp / 코데 쿠아 ty / c6277?ぃぃ w = msvc-160

    NULL application name with an unquoted path in call to CreateProcess
    htps : // / lp. 헉 ぇ. 코 m/우우키/ぢspぁy/ぅc포 BJ/누르l+아니 pぃ카치온+나메+우우 th+안+뿅쿠오테 d+파 th+인+카르+와+C레아테 P로세스

    CWE-428: Unquoted Search Path or Element
    htps // c ぇ. 봐. rg/다타/로 후니니온 s/428. HTML

    쉬운 눈 해설
    h tp : // Sekuri ty chi ck ぃ st. 네 t/세쿠리 ty/cy베르 있던 ck/응쿠오테 d-P로g등 m파 th. HTML

    좋은 웹페이지 즐겨찾기