잠재적으로 위험한 애플리케이션을 실행할 계획입니다.(브라우저 등)별도의 X 서버에 있지만 각 서버에는 자체 클립보드가 있으므로 한 창에서 다른 창으로 링크/텍스트를 복사하는 것은 불가능합니다.
대부분의 기사에서는 이를 수행하기 위해 xclip 및 기타 유사한 유틸리티 스크립트를 사용할 것을 권장합니다.
하지만 어떻게바르게실수로 새로운 취약점이 생성되는 것을 방지하기 위해 범용 클립보드를 만드시겠습니까?
답변1
참고: 전략 변경을 반영하기 위해 답변이 업데이트되었습니다. 서버/컨테이너에서 Xephyr을 실행하지 않고 호스트/기본 사용 환경에서 실행하고 있습니다. 그 이유는 서버/컨테이너에서 Xephyr를 실행하는 것은 정문 대신 내부 문에 자물쇠를 두는 것과 같기 때문입니다. 악의적인 행위자는 내부 문을 우회하고 X 파이프 원격 소켓을 통해 직접 클립보드에 액세스할 수 있습니다.
동일한 클립보드 취약점 문제에 직면하여 호스트 컴퓨터(내 개인 작업 공간)에서 Xephyr을 실행하고 컨테이너의 서버에서 로컬 Xephyr로 X를 전달하여 문제를 해결했습니다.
Xephyr는 ":2" 모니터에서 실행되는 반면, 내 개인 작업 공간 창과 브라우저는 기본 모니터 ":0"에서 실행됩니다. 두 모니터는 클립보드를 공유하지 않습니다. 각 모니터에는 자체 클립보드가 있습니다. 이것이 모니터 ":0"의 개인 작업 공간 클립보드를 엿보는 것을 방지할 수 있는 유일한 방법입니다. 그런 다음 단축키(예: 기능 키)를 설정합니다. 하나는 클립보드 내용을 ":0"에서 ":2"로 전송하고 다른 하나는 ":2"에서 ":0"으로 전송하므로 모든 권한을 갖습니다.
쉘 스크립트에서 코드는 다음과 같습니다.
xsel --display :0 --clipboard -o | xsel --display :2 --clipboard -i
이 게시물 하단에 표시된 대로 자바스크립트를 사용하고 있지만.
X 전달을 시작하는 쉘 스크립트는 다음과 같습니다.
Xephyr <args> :2
DISPLAY=:2 ssh -X -R 44713:localhost:4713 user@container <<EOF
DISPLAY=:10 PULSE_SERVER=tcp:localhost:44713 openbox --startup firefox
EOF
이 작업을 수행하기 위해 자바스크립트 프로그램을 사용하고 있지만.
아래는 단축키가 매핑된 ':0'과 ':2' 사이에 복사된 자바스크립트 코드입니다. 작동하는지 확인하기 위해 임시 메시지 상자가 나타나는 것을 볼 수 있습니다.
#!/usr/bin/env node
`strict`;
const child_process = require('child_process');
// TODO: write unviewable error messasges to system log
function notifySend(title, msg){
title = title.replace(/"/g, '\\"');
msg = msg.replace(/"/g, '\\"');
//msg = msg.replace(/'/g, '\\'')
try {
child_process.execSync(`notify-send "${title}" "${msg}"`);
} catch(e) {
console.log(`system call "notify-send" failed with ${e.message}`);
}
}
async function clipXfer(fromDispNum,toDispNum){
var clipValue;
let cmd1 = `xsel --display :${fromDispNum} --clipboard --output`;
let cmd2 = `xsel --display :${toDispNum} --clipboard --input`;
try {
clipValue = child_process.execSync(cmd1, { encoding: 'utf-8' });
} catch(e) {
throw Error(`Display ${fromDispNum} clipboard is empty`);
}
await new Promise((resolve, reject)=>{
// eslint-disable-next-line no-unused-vars
var proc = child_process.exec(cmd2, (error, stdout, stderr) => {
//if (stdout) console.log(stdout);
//if (stderr) console.log(stderr);
if (error) {
reject(Error(`${error.message}`));
}
resolve();
});
if (!proc.stdin.write(clipValue))
reject(Error('clipToCont(), pipe write failed'));
proc.stdin.end();
});
}
async function main()
{
let argOff=2;
if (process.argv.length-argOff<2)
throw Error('clip-xfer requires two arguments: fromDispNum, toDispNum');
let fromDispNum = process.argv[argOff];
let toDispNum = process.argv[argOff+1];
argOff+=2;
let f = (outcome)=>{
notifySend("clipXfer", `${fromDispNum} => ${toDispNum} ${outcome}`);
};
await clipXfer(fromDispNum,toDispNum)
.then(f('SUCCESS'))
.catch((e)=>{f(`FAILURE, ${e.message}`); throw e;});
}
//console.log(process.argv);
//console.log(process.env);
main()
.then(()=>{process.exitCode=0;})
.catch((e)=>{
console.log(e);
process.exitCode=1;
});