Vim은 복사-붙여 넣기 공격에 면역성이 있습니까?


112

웹에서 터미널로 붙여 넣어서안됩니다 . 대신 텍스트 편집기에 붙여넣고 명령을 확인한 다음 터미널에 붙여 넣어야합니다.

괜찮습니다.하지만 Vim이 내 텍스트 편집기라면? Vim을 명령 모드로 전환하고 악의적 인 명령을 실행하는 컨텐츠를 위조 할 수 있습니까?


2
@ryekayo 백그라운드에서 명령을 실행하는 방법을 알고 있습니다. 질문은 vim을 삽입 모드에서 명령 모드로 전환 한 다음 무엇이든 실행할 수
있는지에 관한

3
최신 버전의 Vim에는 붙여 넣기가 붙어있어 이런 종류의 공격을 막을 수 있습니다.
사토 카츠라

2
@ EmilJeřábek 게시물의 링크를 사용하면 언덕이 아닌 언덕을 달리기에 충분한 이유를 알 수 있습니다.
Satō Katsura

1
@ EmilJeřábek 이스케이프 문자로 숨겨진 텍스트를 위조 할 수 있기 때문에 EOF로 텍스트를 위조 할 수도 있다고 가정합니다. 그런 다음 숨겨진 텍스트에는 다음과 같은 내용이 포함될 수 있습니다 /bin/bash ; EOF rm -rf ~. 터미널에 붙여 넣으면 bash가 시작되고 종료 한 다음 집을 삭제합니다. 고양이에 붙여 넣으면 고양이가 명령을 인쇄하고 고양이를 끝내고 집을 삭제할 수 있습니다.
Adam Trhon

답변:


106

짧은 대답 : 여러 상황에서 Vim은 이러한 종류의 공격에 취약합니다 (삽입 모드에서 텍스트를 붙여 넣을 때).

개념의 증거

링크 된 기사를 시작점으로 사용하여 HTML span 요소와 CSS를 사용하여 텍스트의 중간 부분을 숨겨서 ls -la캐주얼 뷰어 만 볼 수 있도록 다음 코드로 웹 페이지를 신속하게 만들 수있었습니다 . 출처). 참고 :는 ^[이스케이프 문자이고 ^M캐리지 리턴 문자입니다. Stack Exchange는 사용자 입력을 삭제하고 CSS를 사용하여 콘텐츠를 숨기는 것을 방지 하므로 개념 증명을 업로드했습니다 .

ls ^[:echom "This could be a silent command."^Mi -la

삽입 모드에 있고이 텍스트를 터미널 Vim에 붙여 넣으면 (일부 한정자와 함께 아래 참조) 명령 ls -la을 실행 :messages하면 숨겨진 Vim 명령의 결과를 볼 수 있습니다.

방어

정상 모드를 유지하고 사용하여 붙여 넣기하는 것이 가장 좋습니다이 공격에 대한 방어 "*p"+p. 일반 모드에서는 페이지의 레지스터에서 utting의 텍스트 (숨겨진 부분 포함) 전체 텍스트를 붙여 넣습니다. 삽입 모드 (에도 :set paste)가 설정되어있는 경우에도 마찬가지 입니다.

브라켓 붙여 넣기 모드

최신 버전의 Vim은 이러한 유형의 복사 붙여 넣기 공격을 완화 하는 브라켓 붙여 넣기 모드 를 지원 합니다. Sato Katsura는 "브래킷 붙여 넣기 지원은 Vim 8.0.210에 나타 났으며 가장 최근에는 8.0.303 (2017 년 2 월 2 일에 릴리스) 버전에서 수정되었습니다"라고 설명했습니다.

참고 : 내가 알고있는 것처럼, 괄호 붙여 넣기 모드를 지원하는 빔의 버전을 해야 사용하여 붙여 넣을 때 당신을 보호 Ctrl- Shift- V(대부분의 GNU / 리눅스 데스크톱 환경을), Ctrl- V(MS 윈도우), Command- V(맥 OS X) Shift- Insert나 마우스 가운데 클릭.

테스팅

나중에 Lubuntu 16.04 데스크톱 시스템에서 일부 테스트를 수행했지만 결과가 혼란스럽고 결정적이지 않았습니다. 나는 항상 GNU 스크린을 사용하기 때문에 이것이 깨달았다는 것을 알았지 만 스크린 은 브라켓 붙여 넣기 모드를 활성화 / 비활성화하는 데 사용되는 이스케이프 시퀀스를 필터링합니다 ( 패치가 있지만 한 번에 제출 된 것처럼 보입니다) 프로젝트가 적극적으로 유지되고 있지 않았습니다). 필자의 테스트에서 개념 증명은 Vim 또는 터미널 에뮬레이터가 브라켓 붙여 넣기 모드를 지원하는지 여부에 관계없이 GNU 화면을 통해 Vim을 실행할 때 항상 작동합니다.

추가 테스트는 유용하지만 지금까지 GNU 에뮬레이션이 관련 이스케이프 시퀀스를 차단하지 않는 한 터미널 에뮬레이터에 의한 브라켓 붙여 넣기 모드 지원이 내 개념 증명을 차단한다는 것을 알았습니다. 그러나 사용자 nneonneo 는 이스케이프 시퀀스를 신중하게 조작하여 브래킷 붙여 넣기 모드를 종료하는 데 사용할 수 있다고 보고 합니다.

최신 버전의 Vim을 사용하더라도 사용자 *가 삽입 모드에서 ( Ctrl- R*) 를 입력 하여 레지스터 에서 붙여 넣을 경우 개념 증명이 항상 작동합니다 . 이는 입력 된 입력과 붙여 넣은 입력을 구별 할 수있는 GVim에도 적용됩니다. 이 경우 Vim은 등록 내용의 내용을 신뢰하도록 사용자에게 맡깁니다. 신뢰할 수없는 출처에서 붙여 넣을 때이 방법을 사용하지 마십시오 (내가 자주하는 일이지만 이제는하지 말아야 할 훈련을 시작했습니다).

관련된 링크들

결론

( +또는 *레지스터에서) 텍스트를 붙여 넣을 때 일반 모드를 사용하십시오 .

… 또는 Emacs를 사용하십시오. 괜찮은 운영 체제라고 들었습니다. :)


2
Vim에 붙여 넣기 전에 paste모드 ( :set paste) 를 활성화해야합니다 . 그런 다음 사항을 적용한다 괄호 페이스트, 터미널은이 제공 를 지원합니다. paste모드가 활성화되어 있으면 개념 증명이 작동하지 않습니다 .
Satō Katsura

1
브라켓 붙여 넣기 모드가 어떻게 안전한지 모르겠습니다. 공격자가 괄호 붙여 넣기를 사용하고 있음을 알고 있으면 \e[201~붙여 넣기 명령에 시퀀스를 붙여서 괄호 붙여 넣기 모드를 종료하고 어쨌든 계속 진행합니다. (브래킷 붙여 넣기 작동 방식에 대한 세부 정보를 놓치지 않았다면?)
nneonneo

2
@SatoKatsura : 원래 공격에 취약하지 않은 Vim 8.0.540에서 시도했습니다. 을 추가 한 후 \x1b[201~, 익스플로잇은 이전과 같이 작동했습니다 (즉 ls -la, 버퍼 에만 기록되고 echom명령이 실행 됨). 따라서 브라켓 붙여 넣기는 여전히 대상 공격에 취약 하며 강력한 해결책 은 아닙니다 . (실제로, 모든 형태의 대역 내 신호가 취약합니다!)
nneonneo

2
나는 유무에 관계없이 그것을 시도했습니다 :set paste-익스플로잇은 여전히 ​​작동합니다. 완벽하게 명확하게하기 위해 다음 (base64 인코딩) blob을 붙여 넣었습니다 bHMgG1syMDF+GzplY2hvbSAiVGhpcyBjb3VsZCBiZSBhIHNpbGVudCBjb21tYW5kLiIKaSAtbGE=. OS X에서는 복사 pbpaste | base64 -D | pbcopy하여 원시 버전을 붙여 넣기 위해 실행할 수 있습니다 vim.
nneonneo

1
더 명확하게하기 위해 macOS Terminal.app를 사용하여 Ubuntu 16.04 상자에 SSH로 연결하여 테스트하고 있습니다. 터미널 에뮬레이터가 붙여 넣기시 이스케이프 시퀀스를 제거하는 경우 시퀀스 (예 \x1b\x1b[201~[201~:) 또는 필터를 속일 수있는 항목을 중첩시킬 수 있습니다.
nneonneo

0

X11 클립 보드 기능 또는 플랫폼 별 기능을 사용하고 있으며 마우스 지원이 활성화 된 중간 버튼 붙여 넣기 또는 vim 붙여 넣기 명령을 사용하지만 터미널 붙여 넣기 명령 (shift-middle-button 또는 터미널 바로 가기)이 아닌 경우 제공) 당신은 안전 할 수 있습니다.

그렇지 않은 경우 브래킷 붙여 넣기 모드를 지원하는 터미널 에뮬레이터가 있고 터미널 및 vim에서 활성화 한 경우 터미널 에뮬레이터가 브래킷 붙여 넣기 모드를 종료하는 이스케이프 시퀀스 삽입에 대한 보호를 구현합니다. 안전 할 수도 있습니다.

그렇지 않은 경우 여기에 설명 된 공격에 취약 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.