사용자가 실행 파일을 만들어 실행하지 못하도록 막을 방법이 있습니까?


31

랜섬웨어 공격은 제로 데이 익스플로잇을 사용할 수 있지만 공격자는 다운로드 및 클릭을 통해 실행 가능한 사용자를 속일 수 있습니다.

순진한 사용자가 있고 일반 경로로 제한하려고한다고 가정하십시오. 실행 권한이있는 파일을 만들 수 없도록 제한하는 방법이 있습니까?

또는 더 일반적으로 액세스 제어 목록을 작성하고이 사용자가이 목록의 파일 만 실행할 수 있도록 정의 할 수있는 방법이 있습니까?


7
이러한 방식으로 실행을 비활성화하면 사용자가 시스템에서 작업을 수행 할 수 없습니다 . 이러한 유형의 보안 잠금을 수행하는 것으로 알고있는 시스템에 내장 된 시스템이나 타사 소프트웨어를 사용하는 메커니즘은 없습니다
— Thomas Ward

3
사용자가 쓸 수있는 마운트에 noexec를 추가하십시오. 스크립트를 막지는 않지만 실제 이진 실행을 방지합니다.
— 삼포 사라 라

3
@ThomasWard, 그것이 제한된 쉘이 정확히 무엇입니까?
— Robert Riedl

7
@ThomasWard는 (일반적으로 서명 된) 실행 파일의 특정 목록이 허용되고 승격 된 권한 없이는 다른 것을 실행할 수없는 '허용 된 실행 파일'이라는 일반적인 개념이 있습니다. Windows와 OS X 모두이를위한 합리적인 솔루션을 제공합니다. 그래도 응용 프로그램 허용 목록에 적합한 우분투 (또는 다른 Linux) 솔루션이 있는지 모르겠습니다.
— Peteris

2
@Peteris에는 여러 가지 솔루션이 있습니다. 내가 가장 좋아하는 것은 실행 파일이있는 서명 된 읽기 전용 파일 시스템을 가지고 있으며 noexecChromeOS가 dm_verity루트 파일 시스템 무결성을 보장 하는 방법에 따라 다른 모든 것을 마운트하는 것 입니다. 하드 코어를 잘 모르는 사람들은 EVM 모듈을 사용할 수 있습니다. Gentoo의 문서는 wiki.gentoo.org/wiki/Extended_Verification_Module 을 참조하십시오 .
— Charles Duffy

답변:


50

우려를 표명 한 구체적인 공격은 다음과 같습니다.

종종 공격자는 다운로드 및 클릭을 통해 실행 가능한 사용자를 속이는 사용자를 속일 수 있습니다.

적어도 파일이 웹 브라우저에서 다운로드되는 일반적인 경우에, 우분투에서는 브라우저가 Execute-Permission Bit Required 정책을 준수함으로써 이미이를 방지해야 합니다 . 해당 정책에서 가장 직접적으로 관련된 부분은 다음과 같습니다.

  • 데스크탑 및 쉘을 포함한 응용 프로그램은 파일이 둘 다일 때 파일에서 실행 코드를 실행해서는 안됩니다.

    • 실행 가능한 비트 부족
    • 사용자의 홈 디렉토리 또는 임시 디렉토리에 있습니다.
  • 웹 브라우저, 메일 클라이언트 등에서 다운로드 한 파일은 실행 파일로 저장해서는 안됩니다.

따라서 사용자에게 웹 브라우저에서 프로그램을 다운로드하라는 메시지가 표시되면 두 번 클릭하여 파일을 실행하려고 시도하면 실행되지 않습니다. 이것은 다운로드 한 파일이 셸 스크립트 또는 .desktop 파일 인 경우에도 적용됩니다. ( 홈 디렉토리의 .desktop 파일 이 실제로 프로그램 이 아니더라도 실행 파일로 표시되어야하는 이유가 궁금하다면 , 그 이유입니다.)

사용자는 구성 변경을 통해이 동작을 변경할 수 있습니다. 대부분의 사람들은 그렇지 않을 것입니다. 아마 그렇게하지 말아야 할 사람들은 그렇게 걱정하지 않아도됩니다. 더 큰 문제는 당신이 이미 악의적 인 사람 (또는 봇) 특정 파일을 다운로드하는 사용자를 지시하는, 걱정 생각보다 복잡한 공격이다, 그것은 자신을 실행 표시 (자신의 파일 브라우저를 통해 또는과 chmod), 및 그런 다음 실행하십시오.

불행히도, 사용자가 파일에서 실행 비트를 설정하거나 일부 허용 목록에있는 파일 이외의 파일을 실행하는 기능을 제한해도 문제가 눈에 띄게 완화되지는 않습니다. 일부 공격은 이미 작동하고 사소하게 수정 될 수없는 공격도 가능합니다. 근본적인 문제는 파일에 실행 권한이없는 경우에도 파일 실행 효과를 얻을 수 있다는 것 입니다.

이것은 예를 통해 가장 잘 설명됩니다. 한다고 가정은 evil현재 디렉토리, 그 경우 주어진 실행 권한 (의 파일 chmod +x evil)과 실행 ( ./evil뭔가 악을 할 것이다). 프로그램의 종류에 따라 다음 중 하나에 의해 동일한 효과를 얻을 수 있습니다.

마지막 것까지도 파일에 실행 권한이 있거나 사용자가 파일 실행 권한을 부여 할 필요 가 없습니다.

그러나 악의적 인 지시조차 그렇게 복잡 할 필요는 없습니다. NVM을 설치하거나 업데이트하기 위해 공식적으로 권장되는 방법 중 하나 인 이 악성 이 아닌 명령을 고려하십시오 .

wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

악의적이지 않은 이유는 NVM이 악성 코드가 아니기 때문에 URL이 실행시 악의를 가진 다른 사람의 스크립트 인 경우 해당 명령이 스크립트를 다운로드하여 실행하는 것입니다. 어떤 파일에도 실행 권한을 부여 할 필요는 없습니다. 이와 같은 단일 명령으로 악성 파일에 포함 된 코드를 다운로드하고 실행하는 것은 공격자가 사용자를 속이는 일반적인 행동이라고 생각합니다.

사용자가 실행할 수있는 통역사를 제한하려고 할 수 있습니다. 그러나 실제로 사용자가 할 수 있기를 원하는 일반적인 작업에는 실질적으로 영향을 미치지 않는 방법은 없습니다. 몇 개의 프로그램 만 실행하는 키오스크와 같이 컴퓨터에서 사용자가 생각하는 거의 모든 것이 허용되지 않는 매우 제한적인 환경을 설정하는 경우 이는 의미있는 보호 수단을 제공 할 수 있습니다. 그러나 그것은 당신의 유스 케이스처럼 들리지 않습니다.

따라서 귀하의 질문에 대한 대략적인 답변은 "아니오"입니다. 더 완전한 대답은 사용자가 허용 목록에 제공 한 파일을 제외하고 사용자가 파일을 실행하지 못하도록 관리 할 수 있다는 것입니다 . 그러나 그것은 "실행"이라는 엄격하고 기술적 인 의미에 있으며 대부분의 프로그램이나 스크립트를 실행하는 데있어 완전한 효과를 얻는 데 필요하지 않습니다. 방지하기 위해 것을 , 당신이 만들려고 수있는 아주 작은, 그래서 그것은 매우 제한 될 수있는 경우를 제외하고 모든 통역을 나열하지 않았다 화이트리스트. 그러나 당신이 그것을 관리하더라도 사용자는 많은 것을 할 수 없었고, 너무 작게 만들면 스스로 다 치지 않을 것입니다. 아마도 아무것도 할 수 없었습니다. ( 토마스 워드의 의견 참조 )

사용자가 자신을 다치게하면 자신을 다치게 할 수 있습니다.

특정 프로그램이 사용되거나 유해 할 수있는 방식으로 동작하는 것을 제한 할 수 있으며 특정 패턴 랜섬웨어가 따르는 경향이있는 경우 특정 일반적인 경우를 방지 할 수 있습니다. ( AppArmor 참조 ) 일부 값을 제공 할 수 있습니다. 그러나 원하는 포괄적 인 솔루션에 가까운 것은 아닙니다.

어떤 기술적 조치 (있는 경우)를 취하 든 가장 좋은 방법은 사용자를 교육하는 것입니다. 여기에는 그들이 이해하지 못하는 명령을 실행하지 말고, 왜 그렇게 안전한지 설명 할 수없는 상황에서 다운로드 한 파일을 사용하지 말라고 지시하는 것이 포함됩니다. 그러나 백업을 만드는 것과 같은 것들도 포함되어 있기 때문에 (맬웨어 등으로 인해) 문제가 발생할 경우 가능한 피해는 거의 없습니다.


6
아마도 비 기술적 인 조치에는 자신이하고 싶은 일을 온전히 점검 할 수있는 사람을위한 연락처 정보가 포함되어야합니다 . 확실하지 않은 경우 언제든지 전화 나 메시지를 보내 문의하십시오. 그것은 추측하려는 유혹을 제거 할 수 있습니다.
— Peter Cordes


Minor nit : " . ./evil또는 " source ./evil에서 명령 실행 evil.sh-해당 source명령은 evil확장자를 지정하지 않으면 명령을 실행합니다 ( 예. ./evil.sh
— 추가 통지가있을 때까지 일시 중지됨).

@DennisWilliamson 감사합니다-고정되었습니다! 그것은 다른 스크립트 이름을 사용한 답변의 오래된 (제출되지 않은) 거친 초안에서 남았습니다. 나는 그것이 어리 석다는 것을 금방 깨달았지만 모든 사건을 바꾸는 데 실패한 것 같습니다.
— 엘리아 카간

1
"이 스크립트를 가져 와서 실행"하는 소프트웨어를 설치하거나 업데이트하는 방법을 볼 때마다 발톱이 약간 구부러집니다. 어떤 사람이 단일 문자로 꺼져 있거나 O 대신 0을 사용하거나 모호하게 UTF-8 문자를 사용하여 자신의 악성 스크립트를 고수하는 GitHub 계정 / 저장소를 만드는 것을 막을 수있는 것은 없습니다 ... 그냥 필요한 것은 하나입니다 wget 명령과 bam에 오타가 있습니다.
— 이안 켐프

11

예 *


이를 제한된 쉘이라고합니다.

/bin/rbash우분투에서 이미 사용 가능한을 사용 하고이를 제한된 PATH 변수 와 결합 할 수 있습니다 . 에없는 경우에는 rbash실행이 금지됩니다 $PATH.

제한된 사용자 추가 :

sudo adduser --shell /bin/rbash res-user

바이너리를 연결할 수있는 새 디렉토리를 만들어 사용자가 다음으로 제한되도록합니다.

sudo mkdir /home/res-user/bin

.profile파일을 수정 하십시오.

sudo vim /home/res-user/.profile

if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

readonly PATH=/home/res-user/bin
export PATH

만들기 기능 .profile, bashrc그리고 .bash_profile불변 :

sudo chattr +i /home/res-user/.profile
sudo chattr +i /home/res-user/.bashrc
sudo chattr +i /home/res-user/.bash_profile

이제 우리는 사용자에게 그가 할 수있는 유일한 일, 즉 Firefox를 엽니 다 :

sudo ln -s /usr/lib/firefox/firefox /home/res-user/bin/

이제 로그인하면 res-userFirefox 만 열 수 있습니다.

res-user@localhost:~$ /home/res-user/bin/firefox --version
Mozilla Firefox 68.0.1

우리는 제한된 쉘을 쉽게 벗어날 수 없습니다.

res-user@localhost:~$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
-su: PATH: readonly variable

제한된 사용자는 파일을 실행 가능하게 만들거나 시작할 수 없습니다.

res-user@localhost:~$ chmod +x script.sh 
Command 'chmod' is available in '/bin/chmod'
res-user@localhost:~$ bash script.sh 
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

사용자가 필요한 명령을 실행할 수 없기 때문에 제한된 사용자는 인터넷에서 악의적 인 스크립트를 실행할 수 없습니다.

res-user@localhost:~$ wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
Command 'wget' is available in '/usr/bin/wget'
The command could not be located because '/usr/bin' is not included in the PATH environment variable.
wget: command not found
Command 'bash' is available in '/bin/bash'
The command could not be located because '/bin' is not included in the PATH environment variable.
bash: command not found

* 제한된 쉘 에서 벗어날 수 있는 방법이 있지만, 사용자가 그렇게 할 수 있다면 생각하기 어려운 것처럼 보이지 않을 수 있습니다.


2
이것은 " 컴퓨터에서 사용자가 생각하는 거의 모든 것이 허용되지 않는 매우 제한된 환경 "을 달성하려고 시도합니다 (내 대답에 넣었을 때). res-user그래픽으로 로그인 할 수 없습니다. 그들이 할 수있는 유일한 유용한 일은 ssh -Xin and run firefox입니다. 더 많은 명령을 허용하여 사용자가 작업을 수행 할 수 있습니다. 그러면 헤어지는 것이 쉬워집니다. 연결된 방법 중 몇 가지를 하나의 라이너 (공격자가 제공 할 수있는)로 만들 수 있습니다. 사용자가 제한을 방해하는 것을 발견하면 예전처럼 정통하거나 속기 쉬운 상태를 유지하면서이를 우회하는 전문가가됩니다.
— Eliah Kagan

1
@EliahKagan 예, 맞습니다. 사용자가 필요로하는 모든 것을 연결해야합니다. 그러나 이것은 접근 통제 목록을 작성하고이 사용자가이 목록에있는 파일 만 실행할 수 있도록 정의 할 수있는 방법이 [...] 매우 가깝습니다 . 따라서 OP에 도움이 될 수 있습니다. 이 껍질을 벗기는 것은 불가능하지 않지만 꽤 어렵습니다. 특정 리소스 또는 점프 호스트에 대한 외부 액세스를위한 유사한 설정이 있습니다. 제한된 셸 설정에 대한 광범위한 공격이 있는지 의심합니다 .... 공격자가 환경을 알고 있는 표적 공격을 처리하는 경우 모든 베팅이 중단됩니다.
— Robert Riedl

4
각주를 답변의 첫 줄로 올릴 것입니다.
— 추후 공지가있을 때까지 일시 중지되었습니다.

키오스크 모드 또는 다른 강화 된 브라우저에서 크롬을 사용하는 것이 좋습니다. 매우 높은 권한과 시스템 명령 실행으로 firefox 플러그인 또는 확장 프로그램을 설치하는 것이 매우 쉽습니다. 파이어 폭스에서는 최신 버전을 사용하고 확장자를 허용하지 않아야합니다.
— Benjamin Gruenbaum

추가 보호를 위해 noexec 옵션으로 마운트 된 파일 시스템에 대한 쓰기 권한 만 사용자에게 제공하십시오.
— Dan D.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.