X11을 프록시할 때 socat은 실패하지만 ssh는 성공하는 이유는 무엇입니까?

X11을 프록시할 때 socat은 실패하지만 ssh는 성공하는 이유는 무엇입니까?

저는 간단한 X11 유닉스 소켓 기반 프록시를 작성하려고 합니다. 다양한 표준 애플리케이션을 시도하고 나만의 코드를 작성했지만 얻은 결과는 매우 다양했습니다. 무엇이 잘못되었나요?

배경:나의 궁극적인 목표는 xpra 및 xepyr에 대한 경량 대체품으로 보안 목적으로 필터링 X11 프록시를 구현하는 것입니다. 바라보다Firejail을 사용하여 Firefox 브라우저 샌드박스X11 취약점에 대한 추가 정보.

노력하다

  • ssh localhost -X

    우리는 X 리트윗을 알고 사랑합니다 ssh. 좋은 결과.

  • ssh localhost -R /tmp/.X11-unix/Xnnn:/tmp/.X11-unix/X0

    ssh소켓도 전달할 수 있으며 X 전달이 이를 잘 처리합니다. (참고로 수동으로 설정해야 합니다 DISPLAY=:nnn.)

  • socat UNIX-LISTEN:/tmp/.X11-unix/Xnnn,fork UNIX-CONNECT:/tmp/.X11-unix/X0

    socat본질적으로 소켓 프록시로 설계된 프로그램입니다. 그러나 이를 통한 X11 전달은 불안정합니다. (참고로 수동으로 설정해야 합니다 DISPLAY=:nnn.)

  • socat UNIX-LISTEN:/tmp/.X11-unix/Xnnn UNIX-CONNECT:/tmp/.X11-unix/X0

    모든 연결을 분기하는 대신 socat하나의 연결만 처리한 다음 종료할 수 있습니다. 이렇게 하면 Firefox가 작동하지만 Okular 또는 keepassx는 작동하지 않으며 지속적으로 실행되는 프록시가 필요하기 때문에 어떤 경우에도 실용적이지 않습니다.

  • 소켓 전달을 위해 작성한 Haskell 애플리케이션

    애플리케이션은 들어오는 각 연결에 대해 스레드를 시작하고 프록시 소켓에서 서버 소켓으로 또는 그 반대로만 데이터를 전달합니다. 결과는 같습니다socat fork

  • 내가 작성한 Haskell 앱은 소켓을 전달하지만 하나의 연결만 허용합니다.

    위와 동일하지만 하나의 연결만 허용합니다. 결과 socat는 no 와 동일하며 fork이는 의심스럽습니다.

결과

나는 기본 X 애플리케이션( , , , ), Firefox, Firefox를 사용하여 xterm모든 프록시 시도를 테스트했습니다 xeyes.xclockxev오쿠라그리고 keepassx. 결과는 다음과 같습니다. ✓ 유효한 경우, 유효하지 않은 경우 공백입니다. 작동하지 않는 조합의 경우 애플리케이션은 출력 없이 "중단"되며 아무 것도 수행 중이라는 표시도 없습니다.

ssh -X ssh -R socat fork socat아니요fork 하스켈 애플리케이션 Haskell 응용 프로그램은 하나만 허용됩니다.
베이직X
파이어폭스 브라우저
오쿠라
비밀번호를 유지하다

질문

가장 큰 질문은 왜 작동하지 않는가 socat입니다 ssh. socat유일한 작업은 소켓을 전달하는 것이므로 다른 작업이 있는 것 외에도 성능이 좋지 않다는 것에 놀랐습니다 ssh. 내가 찾은openssh의 소켓 전달 소스socat하지만 작동하지 않는 방식으로 작동하는 이유를 이해하기에는 너무 복잡합니다.

내가 누락되었을 수 있는 소켓 프록시 애플리케이션에 분명한 내용을 작성해야 합니까?

배울 수 있는 X를 성공적으로 전달할 수 있는 간단한(몇백 줄) 소켓 프록시의 예제 소스 코드가 있습니까? openssh 코드 베이스가 너무 큽니다.

Firefox가 새 연결 허용을 중단하면 socat내 앱이 갑자기 Firefox와 작동하기 시작하는 이유는 무엇입니까 ?

답변1

하나 이상의 X 확장(내 생각에는 DRI가 그 중 하나라고 생각함)은 유닉스 도메인 소켓을 통해 파일 설명자를 보내고 이러한 파일 설명자는 프록시되지 send않습니다 recv. 대신 sendmsg/를 사용 recvmsg하고 모든 CMsg 데이터를 보내야 합니다.

이것은 당신이 찾은 결과를 잘 설명합니다. socat파일 설명자가 프록시되지 않고(코드에서 호출되지 않음 sendmsg) 하스켈 애플리케이션도 프록시되지 않는다고 생각합니다 . 왜 그것이 작동하는지 이해하지 못합니다 ssh -R.

네이티브 X11 프록시를 작성하려고 할 때 나 자신도 이 문제로 인해 당황했습니다. 마침내 소스 코드를 조작하여 문제를 해결했고 xtrace유닉스 연결을 성공적으로 프록시했습니다.

관련 정보