본문 바로가기

Programming/보안

관리자로서 안전하게 웹 검색 및 전자 메일 읽기

관리자로서 안전하게 웹 검색 및 전자 메일 읽기

 

Michael Howard
Microsoft Security Engineering

요약: Michael Howard는 도구를 사용하여 인터넷에 액세스할 때 불필요한 관리 권한을 제거함으로써 관리자로서 실행하고 안전하게 인터넷 데이터에 액세스하는 방법에 대해 설명했습니다.

DropMyRights.msi 파일 다운로드 

제가 여러 번 말씀 드렸지만 다시 한 번 말씀 드립니다. "관리자 계정으로 실행하는 것은 컴퓨터와 데이터 상태에 위험합니다." 그러므로 누군가가 관리자로 컴퓨터를 운영해야 한다고 말할 때마다 항상 보안 관점에서 볼 때 올바른 일이 아니라고 설득합니다. 저는 가끔 합당한 이유가 있는 사람을 만납니다. 예를 들어 저는 사무실의 컴퓨터를 사용하여 매일 최신 Windows 빌드를 설치합니다. 그리고 OS를 설치하려면 관리자이어야 합니다. 그러나 중요한 점은 제가 그 컴퓨터에서 관리자로 실행할 때에는 전자 메일을 읽지 않으며 웹을 검색하지도 않고 어떠한 형태로도 인터넷에 액세스하지 않는다는 사실입니다. 왜냐하면 웹이 오늘날 위험한 공격 대부분의 원인이기 때문에 그렇게 하지 않습니다.

웹을 검색해야 할 경우에는 어떻게 합니까? 혹은 전자 메일을 읽어야 할 경우에는 어떻게 합니까? 혹은 인스턴트 메시지 등등의 경우나 어떤 이유에서 관리자 컨텍스트에서 실행해야 할 경우에는 어떻게 합니까? 컴퓨터에 대한 주요 위협을 살펴보면 위협은 브라우저와 전자 메일 클라이언트 등의 도구를 통하여 웹과 사용자의 상호 작용에서 발생합니다.
물론 블래스터 (http://www.cert.org/advisories/CA-2003-20.html  )와 라이온 (http://www.sans.org/y2k/lion.htm )과 같은 사용자 상호 작용이 아닌 공격이 있으며 Windows XP SP2에서 방화벽을 설정한 이유 중 하나입니다.

참고   비관리자로서 실행하는 가장 좋은 방법에 대해서는 Windows에서 비관리자로서 실행하는 방법을 모아 놓은 Aaron Margosis의 블로그 를 참조하시기 바랍니다.

관리자로서 실행하는 것이 나쁜 이유의 예

어떤 악성 멀웨어는 웹을 검색하는 사용자가 관리자일 때에만 실행됩니다. 좋은 예가 W32.Beagle.AVmm이라고 하는 Bagle/Beagle 웜의 최근 변종입니다. 그 웜이 컴퓨터 시스템에 초대되어 어떻게 공격하는지 대해 충분히 읽어볼 것을 권합니다.Symantec(http://securityresponse.symantec.com/avcenter/venc/data/w32.beagle.av@mm.html )에 좋은 자료가 있습니다. 멀웨어는 코드 또는 디자인 결함으로 발생하는 것이 아니기 때문에 초대되었다고 말했습니다. 멀웨어는 단순한 사람의 오류를 통해 발생합니다.

이 멀웨어가 실행하는 여러 가지 중에 관리자 권한이 필요한 것은 다음과 같습니다 :

    • system32 디렉토리에서 파일 만들기.
    • 여러 프로세스 종료.
    • Windows 방화벽 해제.
    • system32 디렉토리로 파일 다운로드 및 쓰기.
    • HKLM의 레지스트리 값 삭제.

전자 메일 클라이언트를 실행하는 사용자가 관리자가 아닐 경우 이러한 모든 동작은 실패합니다.

관리자로서 일상 작업을 해야 하는 경우에라도 비관리자로 웹을 검색하거나 전자 메일을 읽는 등의 작업을 하는 것이 유용하지(안전하지) 않습니까? 다행히 Windows XP와 Windows Server 2003 이상은 제한된 토큰을 사용하는 이 기능을 지원합니다.

자세한 사항

Windows XP와 Windows Server 2003 이상에서는 소프트웨어 제한 정책(SAFER 라고도 함),이라는 기능을 지원하며 이 기능을 사용하여 사용자나 소프트웨어 개발자가 응용 프로그램을 시작할 때 자격 증명 정보를 입력하지 않고도 낮은 권한으로 코드를 실행할 수 있습니다. 예를 들어 관리자가 응용 프로그램이 실행될 때 응용 프로그램의 토큰에서 특정 SID와 권한을 제거하여 일반 사용자로 응용 프로그램을 실행할 수 있습니다. 웹 브라우저, 인스턴트 메시징, 전자 메일 클라이언트 등 대부분의 유명한 인터넷 접속 응용 프로그램은 관리자 컨텍스트에서 실행해서는 안됩니다.

DropMyRights 응용 프로그램

DropMyRights은 관리자로서 실행해야 하는 사용자가 훨씬 안전한 컨텍스트 즉 비관리자 컨텍스트에서 응용 프로그램을 실행할 수 있는 매우 단순한 응용 프로그램입니다. 이 프로그램은 현재 사용자 토큰을 가져와 그 토큰에서 여러 권한과 SID를 제거한 다음 그 토큰을 사용하여 Internet Explorer 또는 Outlook 등의 다른 프로세스를 시작함으로써 그렇게 합니다. 이 도구는 Mozilla의 Firefox, Eudora 또는 Lotus Notes 전자 메일과 함께 잘 작동합니다.

코드는 더 이상 단순할 수 없습니다. 다음은 핵심 코드입니다 :

//////////////////////////////////////////////////////////////////////////////////
DWORD wmain(int argc, wchar_t **argv) {

   DWORD fStatus = ERROR_SUCCESS;

   if (2 != argc && 3 != argc) {
      Usage();
      return ERROR_INVALID_PARAMETER;
   }

   // get the SAFER level
   DWORD hSaferLevel = SAFER_LEVELID_NORMALUSER;
   if (3 == argc && argv[2]) {
      switch(argv[2][0]) {
         case 'C' : 
         case 'c' :  hSaferLevel = SAFER_LEVELID_CONSTRAINED; 
                  break;
         case 'U' :
         case 'u' :   hSaferLevel = SAFER_LEVELID_UNTRUSTED;
                  break;

         default  :   hSaferLevel = SAFER_LEVELID_NORMALUSER;
                  break;
      }
   }

   // get the command line, and make sure it's not bogus
   wchar_t *wszPath = argv[1];
   size_t cchLen = 0;
   if (FAILED(StringCchLength(wszPath,MAX_PATH,&cchLen)))
      return ERROR_INVALID_PARAMETER;

    SAFER_LEVEL_HANDLE hAuthzLevel = NULL;
    if (SaferCreateLevel(SAFER_SCOPEID_USER,
                         hSaferLevel,
                         0, 
             &hAuthzLevel, NULL)) {

        //  Generate the restricted token we will use.
        HANDLE hToken = NULL;
        if (SaferComputeTokenFromLevel(
            hAuthzLevel,    // SAFER Level handle
            NULL,           // NULL is current thread token.
            &hToken,        // Target token
            0,              // No flags
            NULL)) {        // Reserved

         STARTUPINFO si;
         ZeroMemory(&si, sizeof(STARTUPINFO));
         si.cb = sizeof(STARTUPINFO);
         si.lpDesktop = NULL;
       
         // Spin up the new process
         PROCESS_INFORMATION pi;
         if (CreateProcessAsUser( 
            hToken,
            wszPath, NULL,
            NULL, NULL,
            FALSE, CREATE_NEW_CONSOLE,
            NULL, NULL,  
            &si, &pi)) {

               CloseHandle(pi.hProcess);
               CloseHandle(pi.hThread);

         } else {
            fStatus = GetLastError();
            fwprintf(stderr,L"CreateProcessAsUser failed (%lu)\n",fStatus);
         } 
      } else {
         fStatus = GetLastError();
      }

      SaferCloseLevel(hAuthzLevel);

   } else {
      fStatus = GetLastError();
   }

   return fStatus;
}

소스 코드와 실행 파일은 이 기사 상단에서 다운로드할 수 있습니다. 그럼 지금부터 낮은 권한으로 응용 프로그램을 실행하도록 응용 프로그램을 구성하는 방법을 알아봅시다.

설치

DropMyRights.exe를 어느 한 폴더로 복사합니다. 그런 다음 각 응용 프로그램를 낮은 권한으로 실행하려면 다음 세 섹션의 단계를 수행합니다.

바로 가기 만들기

바로 가기를 만들고 대상 실행 파일로 DropMyRights.exe를 입력하고 그 뒤에 낮은 권한으로 실행할 응용 프로그램 경로를 입력합니다.

예:

C:\warez\dropmyrights.exe "c:\program files\internet explorer\iexplore.exe"

그러면 화면에 그림 1이 나타납니다.

그림 1. 낮은 권한으로 실행할 응용 프로그램의 경로

바로 가기 이름의 업데이트

그런 다음 실행 파일 대상을 나타내도록 바로 가기 이름을 업데이트합니다(dropmyrights이 아님). 저는 보통 이 응용 프로그램이 SAFER 보안 컨텍스트에서 실행된다는 것을 나타내기 위해 응용 프로그램 다음에 ("Safer")를 추가합니다. 또는 그림 2와 같이 "(Non-admin)"를 보통 추가합니다.

그림 2. 바로 가기 이름 업데이트

아이콘과 실행 모드 설정

마지막으로 바로 가기를 만든 후 바로 가기의 실행 옵션을 최소화로 설정하고 원할 경우 새 아이콘을 선택합니다.

그림 3. 실행 옵션을 최소화로 설정하고 선택적으로 아이콘 변경

고급 옵션

DropMyRights의 인수는 다음과 같습니다.

DropMyRights {path} [N|C|U]

변수의 의미는 다음과 같습니다 :

    Path 는 실행할 응용 프로그램의 전체 경로입니다.
    N 은 일반 사용자로서 응용 프로그램 실행을 나타냅니다. 인수를 입력하지 않을 경우 기본값입니다.
    C 는 제약된 사용자로서 응용 프로그램 실행을 나타냅니다.
    U 는 트러스트되지 않은 사용자로서 응용 프로그램 실행을 나타냅니다. 이 설정에서 일부 응용 프로그램이 실행되지 않을 수 있습니다.

이러한 각각의 설정을 식별하는 가장 좋은 방법은 결과 프로세스 토큰을 보는 것입니다. 다음 테이블은 프로세스 토큰의 변경된 사항을 나타냅니다.

테이블 1. 관리자 계정

SIDS SIDS 제한 권한
DOMAIN\Domain Users

Everyone

BUILTIN\Administrators

BUILTIN\Users

NT AUTHORITY
\INTERACTIVE

NT AUTHORITY
\Authenticated Users

\LOCAL

해당 없음 SeChangeNotifyPrivilege

SeSecurityPrivilege

SeBackupPrivilege

SeRestorePrivilege

SeSystemtimePrivilege

SeShutdownPrivilege

SeRemoteShutdownPrivilege

SeTakeOwnershipPrivilege

SeDebugPrivilege

SeSystemEnvironmentPrivilege

SeSystemProfilePrivilege

SeProfileSingleProcessPrivilege

SeIncreaseBasePriorityPrivilege

SeLoadDriverPrivilege

SeCreatePagefilePrivilege

SeIncreaseQuotaPrivilege

SeUndockPrivilege

SeManageVolumePrivilege

SeCreateGlobalPrivilege

SeImpersonatePrivilege

테이블 2. 일반 사용자('N')

SIDS SIDS 제한 권한
DOMAIN\Domain Users

Everyone

BUILTIN
\Administrators

BUILTIN\Users

NT AUTHORITY
\INTERACTIVE

NT AUTHORITY
\Authenticated Users

LOCAL

해당 없음 SeChangeNotifyPrivilege

테이블 3. 제약됨('C')

SIDS SIDS 제한 권한
DOMAIN\Domain Users

Everyone

BUILTIN
\Administrators

BUILTIN\Users

NT AUTHORITY
\INTERACTIVE

NT AUTHORITY
\Authenticated Users

LOCAL

DOMAIN\Domain Users

Everyone

BUILTIN\Users

NT AUTHORITY
\INTERACTIVE

NT AUTHORITY
\Authenticated Users

LOCAL

NT AUTHORITY
\RESTRICTED

SeChangeNotifyPrivilege
테이블 4. 트러스트되지 않음('U')

SIDS SIDS 제한 권한
DOMAIN\Domain Users

Everyone

BUILTIN
\Administrators

BUILTIN\Users

NT AUTHORITY
\INTERACTIVE

NT AUTHORITY
\Authenticated Users
LOCAL

NT AUTHORITY
\RESTRICTED

Everyone

NT AUTHORITY
\INTERACTIVE

NT AUTHORITY
\Authenticated Users

BUILTIN\Users

SeChangeNotifyPrivilege
빨간색 X 표는 SID가 토큰에 남아 있으나 이 SID는 거부 SID임을 나타냅니다. 이 속성의 SID는 거부 전용 SID입니다. 시스템이 액세스 검사를 수행할 때 SID에 적용되는 액세스 거부 ACE를 검사하고 SID에 대한 액세스 허용 ACE를 무시합니다.

가장 큰 권한과 SID 델타는 관리자 계정과 일반 사용자 계정 사이에 있습니다. 위에서 본 바와 같이 모든 권한은 통과 확인 무시 권한 (SeChangeNotifyPrivilege이라고도 함)을 제외하고 토큰에서 제거됩니다. 제약됨과 트러스트되지 않음은 일반 사용자보다 델타가 더 작으며 보안 제한 오류로 응용 프로그램이 실패하는 경우가 있을 수 있습니다. 제 생각으로는 대부분의 경우에 일반 사용자(기본값)를 사용하고 악의적이거나 잠재적으로 위험하다고 생각되는 웹 사이트를 검색할 경우 제약됨을 사용하십시오.

보안 결함 찾기

많은 사람이 지난 기사의 버그를 해결하였습니다. CreateFile 함수는 코드가 파일에서 읽혀질 때 모든 액세스에 대하여 파일을 엽니다. FILE_ALL_ACCESS는 GENERIC_READ 등으로 대체되어야 합니다. 이것은 십중팔구 일반 사용자가 아니라 관리자만이 이 코드를 사용할 수 있기 때문에 좋지 않습니다. 저는 이 오류를 종종 봅니다.

이 코드 결함을 찾아낼 수 있습니까? 이 오류가 Java DNS의 버그처럼 어느 날 내 데스크에서 발견되었습니다. 이것은 흥미로운 버그로 C#로 다시 작성하고 결함을 일반화하였습니다.

Int16 req;
...
while (true) {
    getRequest();
    req++;
    arr[req] = DateTime.Now;
}

Michael Howard 는 Microsoft Secure Engineering 그룹의 수석 보안 프로그램 매니저이며 보안 코드 작성 (2판)의 공동 저자이고 Designing Secure Web-based Applications for Windows 2000의 주요 저자입니다. 또한 IEEE Security & Privacy Magazine의 Basic Training 공동 편집인입니다. 주요 관심사는 보안 시스템이 불충분한 상태에서 아무 것도 디자인, 작성, 테스트, 문서화하지 않도록 확인하는 것입니다. 가장 좋아하는 문구는 "한 사람에게 기능은 다른 사람에게는 공격이다"입니다.