“키보드를 잡지 못했습니다.”라는 오류를 어떻게 디버깅해야합니까? 악의적 인 클라이언트가 세션을 도청 할 수 있습니다. ” 나타납니다. Could not grab keyboard. A malicious client

6 개월 이상 설치 한 Ubuntu 14.04 설치를 실행 중입니다. 약 일주일 전에 오류 메시지가 나타납니다.

Could not grab keyboard. A malicious client may be eavesdropping on your session.

나는 꽤 오랫동안 (보통 밤새) 떠난 후 내 컴퓨터로 돌아올 때만 그것을 보았습니다. 설정된 시간 초과 후 화면이 잠기지 않는 경우가 여러 번 있습니다 (나가기 전에 적극적으로 화면을 잠그기 시작했습니다).

마더 보드의 USB 포트에 직접 연결된 USB 키보드 (Kinesis Advantage)를 사용하고 있습니다. 무선 ELECOM 마우스를 사용하고 있습니다.

떠나기 전에 마우스 동글 연결을 끊으려고합니다. 키 입력을 추적하는 악의적 인 클라이언트가 있는지 또는 연결 문제인지를 어떻게 확인할 수 있습니까?



답변

수수께끼를 해결하는 방법은 다음과 같습니다. 목표는 표준 Ubuntu 유틸리티를 사용하여 시스템의 모든 프로세스 세부 정보를 파고 들어 사용자에게 “어업 방법”을 가르치는 것입니다.

1 단계 (호기심이 많음) :이 오류를 발생시키는 프로그램을 식별하십시오.

# -- You may need to search under more dirs, YMMV
#    List files (incl. binaries) which contain the warning string

$ sudo grep -ral 'malicious client may be eavesdropping' /usr /bin /lib
/usr/lib/openssh/gnome-ssh-askpass

내 환경에서이 경고 문자열을 바이너리에 포함하는 유일한 프로그램은 gnome-ssh-askpass입니다. 이 특정 프로그램에 버그가 있는지 검색 apt-get source ssh-askpass-gnome하고 추가 검사를 위해 소스를 다운로드 할 수도 있습니다 (패키지 이름이 프로그램 이름과 다릅니다).

그러나의 근본 원인은 문제가 아닌 것 같습니다 gnome-ssh-askpass. gnome-ssh-askpass암호 문구를 요구하고 있기 때문에 개발자는 키보드를 잡지 못하고 최악의 시나리오를 가정하고 메시지를 우버-파라노이드로 만들지 않을 때주의를 기울이지 않기로 결정했습니다. 그러나 우연히 임의의 웹 사이트 대화 상자에 암호 또는 암호를 입력하는 것은 좋은 생각이 아니므로 gnome-ssh-askpass개발자가 올바른 전화를 걸었습니다.

최근 점점 더 많은 웹 사이트가 팝업을 표시하고 팝업 대화 상자 외부의 모든 것을 페이드하고 적극적으로 초점을 잡는 연습에 참여하기 시작했습니다. gnome-ssh-askpass키보드를 잡지 못하는 근본 원인 일 수 있습니다 . 브라우저가 해당 사이트에서 열려있는 경우 브라우저를 닫거나 공격적인 웹 사이트를 탐색하는 것이 도움이 될 수 있습니다. 이것이 원인 인 경우 개별 프로세스가 전체 (전체 데스크톱) 포커스를 갖지 못하게하는 데스크톱 설정에 관심이있을 수 있습니다. 예를 들어 KDE에서이 설정은 ( 시스템 설정-> 창 동작-> 초점-> 초점 도난 방지 )에서 찾을 수 있습니다. 정말 편집증을 느낀다면 High또는로 설정하는 것이 좋습니다 Extreme. 물론 이것은 또한gnome-ssh-askpass키보드를 잡거나 더 정확하게 말하면 X초점을 잡는 것 입니다.

2 단계 : 의심스러운 프로세스 식별

Unix에서 장치는 파일 uder로 표시된다는 것을 알고 /dev다음 질문은 파일 시스템 계층에서 장치가 “키보드”를 나타내는 것입니다. 이를 위해 lsof(파일 열기) 유틸리티를 사용할 수 있습니다 .

# look for processes holding devices open, filter out some common ones:
$ sudo lsof | grep /dev | grep -vE '/(null|urandom|zero)'

일반적인 데스크탑 환경에서 장치를 열어 두는 대부분의 프로세스는 열린 상태 /dev/pts/<N>( 의사 tty )를 유지 합니다. 이들은 “관심 장치”입니다.

여기에 무슨 일이 일어나고 있는지에 대한 배경 지식 :

일반적인 Linux 그래픽 데스크탑에서는 프로세스가 키보드와 직접 통신하지 않습니다. 대신 X프로그램 (Xorg)은 장치를 통해 모든 키보드 이벤트를 제어합니다 /dev/input/event<N>. X키보드 이벤트를 처리하는 이벤트 핸들러 (evdev)를 사용합니다. 또한보고이를 확인할 수 있습니다 X: 로그 언급된다./var/log/Xorg.0.logkeyboard

키보드 이벤트는 X이벤트 핸들러에서 열려있는 프로세스 표준 입력을 통해 언제든지 마우스 포인터 포커스가있는 프로세스 로 전달 됩니다 /dev/pts/<N>. 엄밀히 말하면 : 프로세스는 실제로 “키보드 잡기”가 아니고, 키보드가 유지되고 X, 프로세스에 “포커스”만 있거나 관심이 X있으므로 X열린 stdin 파일 설명자를 통해 키보드 이벤트를 전달할 수 있습니다. /dev/pts/<N>.

3 단계 : Xorg는 어떤 프로세스를 특정 시점에 집중하고 있습니까?

특정 시점에 어떤 프로세스에 초점이 있는지 파악하는 방법은 무엇입니까? 여기에 대답하는 askubuntu 질문이 있습니다.

마우스 아래에서 응용 프로그램을 찾으십시오

대답의 요약은 마우스로 탐색하면서 터미널에서 다음과 같은 스크립트를 실행하는 것입니다.

#!/bin/bash
# Print the process tree of the window currently in focus.
# prereqs:
#   sudo apt-get install xdotool psmisc

while true; do
   pstree -spaul $(xdotool getwindowpid "$(xdotool getwindowfocus)")
   sleep 2
done

4 단계 : 프로세스 활동에 대해 더 깊이 파고 들다

의심스러운 프로세스가 식별되면 마지막 단계는이 개별 프로세스를 조사하는 것입니다. 이를 위해 Linux /proc파일 시스템 ( man 5 proc)으로 전환 할 수 있습니다 .

프로세스에 대해 알고 싶은 거의 모든 것이 아래에 /proc있습니다. 실제로 lsof(열린 파일 나열), 프로세스 상태를 검사하는 디버거, ps또는 과 같은 프로세스 나열 유틸리티와 같은 프로그램 top은 모두 /proc커널에 의해 데이터가 채워집니다.

사용 proc하여 프로세스 실행 프로그램이 디스크에있는 위치를 찾을 수 있습니다 (예 : 표준 시스템 디렉토리 외부의 모든 프로그램, 특히 “나에게주의를 기울이지 마십시오” 종류의 이름 으로 숨기려고하는 경우에는 의심 될 수 있음). 디버거 또는 시스템 호출 추적 프로그램을 사용하면 시스템 호출 수준에서 정확히 수행중인 작업을 확인할 수 있습니다 (소스 코드가없는 경우에도).

2 단계와 3 단계는 PID키보드를 읽을 수있는 모든 프로세스 ID를 제공해야합니다 . 이 PIDS 각각에 대해 (각각을로 표시 $pid) 다음을 수행 할 수 있습니다.

$ pid를 전체 명령 행에 맵핑하십시오.

cat /proc/$pid/cmdline

$ pid를 디스크의 실행 파일에 매핑하십시오.

ls -l /proc/$pid/exe

$ pid를 현재 작업 디렉토리에 매핑하십시오 :

ls -l /proc/$pid/cwd

$ pid를 원래 환경에 매핑

cat /proc/$pid/environ | tr '\000' '\012'

실시간 $ pid (및 그 자식 프로세스) 시스템 호출 활동을 추적하십시오.

strace -f -p $pid

(더 있습니다 : 참조 man 5 proc)

파일을 통해 (을 통해 write) 저장하거나 네트워크를 통해을 통해 전송 하여 모든 키 누름에 반응하는 익숙하지 않은 프로세스를 sendto발견하면 키보드 스니퍼를 발견했을 수 있습니다.

(tcp + udp) 네트워크 엔드 포인트가 열려있는 프로세스를 확인할 수도 있습니다.

# See 'man netstat' for details on all options used below
$ sudo netstat -tunapee

결론 :

오류의 가장 큰 원인은 맬웨어가 아니라 여러 프로세스가 동시에 키보드 제어를 시도합니다. 둘 gnome-ssh-askpass중 하나 는 (오류를 인쇄하는 것)입니다. 다른 하나는 공격적인 포커스 획득 대화 상자가있는 사이트의 열린 브라우저 일 수 있습니다.

실제로 일부 악성 코드가 설치되어있는 경우에도 Linux를 사용하므로 모든 프로세스가 투명하게 조사 및 검사 할 수 있습니다. 맬웨어가 실제로 숨겨 지거나 위의 기술을 사용하여 쉽게 찾아 내거나 프로세스를 종료하고 모든 파일을 제거하지 못하게하는 것은 매우 어렵습니다.


답변

내 문제는 두 개의 동시 gnome-ssh-askpass창 때문이었습니다 . SSH를 통해 동일한 서버에 두 개의 rsync 작업이 있었고 둘 다 SSH 인증서의 비밀번호를 요청했습니다. 그들을 그룹화 (연결)하면 나를 위해 해결되었습니다!