Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

관리자 권한 없이 프로그램 실행하기 — UAC 프롬프트 우회 완벽 가이드

많은 프로그램이 실행 시 권한 상승(앱 아이콘에 표시되는 방패 모양)을 요구하지만, 실제로 정상적인 동작에는 관리자 권한이 필요하지 않은 경우가 많습니다. 예를 들어 Program Files 폴더 내 앱 폴더나 해당 프로그램이 사용하는 레지스트리 키에 대해 사용자에게 직접 권한을 부여하면 됩니다. 그러나 이러한 프로그램을 비관리자 계정으로 실행하면 UAC(사용자 계정 컨트롤) 창이 나타나며 관리자 암호 입력을 요구하게 됩니다(UAC가 활성화된 경우). 이 메커니즘을 피하려고 많은 사용자가 UAC를 아예 비활성화하거나, 사용자 계정을 로컬 'Administrators' 그룹에 추가해 관리자 권한을 부여합니다. 물론 두 방법 모두 보안상 매우 위험합니다.

일부 Windows 앱이 표준 사용자로는 실행되지 않고 관리자 권한을 요구하는 이유

앱이 정상적으로 작동하려면 자신의 설치 폴더(C:\Program Files (x86)\SomeApp 등) 내부의 파일(로그, 설정 파일 등)을 수정해야 하는 경우가 있습니다. 기본적으로 일반 사용자는 이 디렉터리에 대한 쓰기 및 수정 권한이 없으므로, 프로그램이 관리자 권한을 요구하게 됩니다. 이 문제를 해결하려면 NTFS 파일 시스템 수준에서 해당 앱 폴더에 대해 사용자(또는 기본 제공 Users 그룹)에게 수정(Modify) 및/또는 쓰기(Write) 권한을 직접 부여해야 합니다.

참고: 사실 변경되는 애플리케이션 데이터를 C:\Program Files 하위 폴더에 저장하는 것은 권장되지 않습니다. 앱 데이터는 사용자 프로필에 저장하는 것이 올바른 방식입니다. 다만 이는 개발자의 게으름과 무능함에서 비롯된 문제이기도 합니다.

관리자 권한이 필요한 프로그램을 표준 사용자로 실행하는 방법

이전에 특정 앱에 대해 UAC 프롬프트를 비활성화하는 RunAsInvoker 매개변수 사용법을 소개한 바 있지만, 이 방법은 유연성이 다소 떨어집니다.

Windows 자격 증명 관리자에 관리자 암호를 저장한 후 /SAVECRED 옵션과 함께 RunAs를 사용할 수도 있지만, 이 역시 안전하지 않습니다. 저장된 관리자 자격 증명으로 해당 컴퓨터에서 어떤 프로그램이든 실행할 수 있기 때문입니다.

여기서는 UAC가 활성화된 상태(UAC 슬라이더 레벨 4, 3 또는 2)에서 어떤 프로그램이든 관리자 권한 없이(관리자 암호 입력 없이) 강제로 실행하는 더 간단한 방법을 살펴보겠습니다.

예시로 레지스트리 편집기인 regedit.exe(C:\Windows\ 폴더에 위치)를 사용해 보겠습니다. 앱 아이콘 옆의 UAC 방패 아이콘에 주목하세요. 이 아이콘은 프로그램 실행 시 UAC를 통한 권한 상승이 요청됨을 의미합니다.

regedit.exe를 실행하면 관리자 자격 증명을 요구하는 사용자 계정 컨트롤 창('이 앱이 디바이스를 변경할 수 있도록 허용하시겠습니까?')이 나타납니다. 암호를 입력하지 않고 권한 상승을 확인하지 않으면 앱은 시작되지 않습니다.

이제 이 프로그램에 대한 UAC 요청을 우회해 보겠습니다. 바탕 화면에 다음 코드가 포함된 텍스트 파일 run-as-non-admin.bat을 생성합니다.

cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %1"

regedit.exe를 관리자 권한 없이 실행하고 UAC 프롬프트를 억제하려면, 실행하려는 EXE 파일을 바탕 화면의 이 BAT 파일 위로 드래그 앤 드롭하기만 하면 됩니다.

그러면 레지스트리 편집기가 UAC 프롬프트 없이, 관리자 암호 입력 없이 실행됩니다. 작업 관리자를 열어 권한 상승(Elevated) 열을 추가하면 regedit.exe 프로세스가 권한 상승되지 않은 상태(비관리자 사용자 권한으로 실행됨)로 표시되는 것을 확인할 수 있습니다.

HKEY_LOCAL_MACHINE 레지스트리 하이브의 값을 수정해 보세요. 사용자에게 시스템 레지스트리 키에 대한 쓰기 권한이 없기 때문에 해당 항목을 편집할 수 없습니다. 반면 사용자 하이브인 HKEY_CURRENT_USER에서는 레지스트리 키와 값을 자유롭게 추가하거나 편집할 수 있습니다.

같은 방식으로 BAT 파일을 통해 어떤 앱이든 실행할 수 있습니다. 실행 파일의 경로만 지정하면 됩니다.

run-app-as-non-admin.bat
Set ApplicationPath="C:\Program Files\SomeApp\testapp.exe"
cmd /min /C "set __COMPAT_LAYER=RUNASINVOKER && start "" %ApplicationPath%"

또한 모든 앱을 권한 상승 없이 실행할 수 있는 바로 가기 메뉴(컨텍스트 메뉴)를 추가할 수도 있습니다. 이를 위해 RunAsUser.REG 파일을 생성하고 아래 코드를 복사한 후 저장하고, REG 파일을 더블클릭하여 Windows 레지스트리로 가져옵니다(이 변경 사항을 적용하려면 관리자 권한이 필요합니다).

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker]
@="Run as user without UAC privilege elevation"
[HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command]
@="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""

이후부터는 파일 탐색기의 바로 가기 메뉴에서 'UAC 권한 상승 없이 사용자로 실행(Run as user without UAC privilege elevation)'을 선택하기만 하면 어떤 응용 프로그램이든 관리자 권한 없이 실행할 수 있습니다.

GPO(그룹 정책)를 사용하여 레지스트리 매개변수를 가져오면 도메인 내 모든 컴퓨터에 이 옵션을 배포할 수도 있습니다.

다시 한번 강조하지만, RUNASINVOKER 모드로 프로그램을 실행한다고 해서 프로그램의 권한이 상승되는 것은 아닙니다. RunAsInvoker는 UAC 프롬프트를 억제하고 현재 사용자의 권한으로 실행하며 권한 상승을 요청하지 않도록 할 뿐입니다. 시스템 설정이나 파일을 수정하기 위해 실제로 상승된 권한이 필요한 프로그램이라면 정상적으로 작동하지 않거나 다시 관리자 권한을 요구하게 됩니다.

__COMPAT_LAYER의 RunAsInvoker로 UAC 우회하는 방법

환경 변수 __COMPAT_LAYER를 사용하면 응용 프로그램에 다양한 호환성 수준(EXE 파일 속성의 호환성 탭)을 설정할 수 있습니다. 이 변수를 통해 프로그램 시작 시 적용할 호환성 설정을 지정할 수 있습니다. 예를 들어 Windows 8 호환성 모드와 640×480 해상도로 앱을 실행하려면 다음과 같이 설정합니다.

set __COMPAT_LAYER=Win8RTM 640x480

__COMPAT_LAYER 변수에는 우리가 관심 있는 몇 가지 옵션이 포함되어 있습니다. 주요 매개변수는 다음과 같습니다.

  • RunAsInvoker – UAC 프롬프트 없이 부모 프로세스의 권한으로 앱을 실행합니다.
  • RunAsHighest – 사용자가 가질 수 있는 최고 수준의 권한으로 프로그램을 실행합니다(사용자가 관리자 권한을 보유한 경우 UAC 프롬프트가 나타남).
  • RunAsAdmin – 앱을 관리자 권한으로 실행합니다(매번 UAC 프롬프트가 나타남).

즉, RunAsInvoker 매개변수는 관리자 권한을 부여하는 것이 아니라 UAC 프롬프트를 억제하는 역할만 합니다.

다음 CMD 코드는 현재 프로세스에 RunAsInvoker 모드를 활성화하고 지정된 프로그램을 권한 상승 없이 실행합니다.

set __COMPAT_LAYER=RUNASINVOKER
start "" "C:\Program Files\MyApp\testapp.exe"

EXE 파일 매니페스트에서 RunAsInvoker 모드 활성화하기

앞서 언급했듯이 Windows 10은 실행 시 권한 상승이 필요한 프로그램에 UAC 방패 아이콘을 표시합니다. 개발자가 응용 프로그램을 컴파일할 때 프로그램 매니페스트(manifest)에 이 요구 사항을 설정하기 때문입니다.

EXE 파일의 매니페스트를 직접 편집하여 프로그램을 상승된 모드로 실행해야 한다는 요구 사항을 제거할 수 있습니다.

프로그램 매니페스트를 편집하려면 무료 도구인 Resource Hacker를 사용하면 됩니다. Resource Hacker에서 앱의 실행 파일을 엽니다.

이 예제에서는 암호 입력 없이 Windows에 자동 로그인할 수 있게 해주는 Sysinternals의 Autologon.exe 도구의 매니페스트를 편집해 보겠습니다.

왼쪽 트리에서 Manifest 섹션으로 이동하여 프로그램 매니페스트를 엽니다. 다음 XML 섹션에 주목하세요.

<requestedPrivileges>
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
</requestedPrivileges>

바로 이 requireAdministrator 옵션 때문에 Windows는 항상 이 프로그램을 관리자 권한으로 실행하려고 시도합니다.

requireAdministrator를 asInvoker로 변경한 후 EXE 파일에 변경 사항을 저장합니다.

이제 프로그램 아이콘에서 UAC 방패가 사라졌으며, 관리자 암호를 묻지 않고 현재 사용자 권한으로 실행할 수 있습니다.

실행 파일이 MS Authenticode(코드 서명 인증서)로 서명되어 있는 경우, EXE 파일을 수정한 후 프로그램이 작동을 멈추거나 경고를 표시할 수 있습니다.

이 경우 프로그램이 외부 매니페스트 파일을 사용하도록 강제할 수 있습니다. EXE 파일이 있는 디렉터리에 일반 텍스트 파일 appname.exe.manifest(예: Autologon.exe.manifest)를 생성하고, Resource Hacker에서 매니페스트 코드를 복사한 뒤 requireAdministrator를 asInvoker로 변경하여 매니페스트 파일을 저장합니다.

Windows가 항상 EXE 파일 실행 시 외부 매니페스트 파일을 사용하도록 하려면 다음과 같은 특수 레지스트리 매개변수를 활성화합니다.

REG ADD "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\SideBySide" /v PreferExternalManifest /t REG_DWORD /d 1 /f

Windows를 재시작한 후, 프로그램이 관리자 권한 없이 실행하도록 지시하는 외부 매니페스트 파일을 사용하는지 확인합니다.