From ac96872afd43a0a67240627aaffa2611e85bed6c Mon Sep 17 00:00:00 2001 From: Divyaranjan Sahoo Date: Wed, 17 Sep 2025 13:30:14 +0530 Subject: [PATCH 1/4] OSC 52: Gate clipboard writes on focus to prevent background clipboard hijacking --- src/cascadia/TerminalCore/Terminal.cpp | 1 + src/cascadia/TerminalCore/Terminal.hpp | 1 + src/cascadia/TerminalCore/TerminalApi.cpp | 3 ++- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 4c5d6eaef18..18e68b0026c 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -784,6 +784,7 @@ TerminalInput::OutputType Terminal::SendCharEvent(const wchar_t ch, const WORD s // - none TerminalInput::OutputType Terminal::FocusChanged(const bool focused) { + _isFocused = focused; return _getTerminalInput().HandleFocus(focused); } diff --git a/src/cascadia/TerminalCore/Terminal.hpp b/src/cascadia/TerminalCore/Terminal.hpp index 73974e85dad..1b072a6d142 100644 --- a/src/cascadia/TerminalCore/Terminal.hpp +++ b/src/cascadia/TerminalCore/Terminal.hpp @@ -414,6 +414,7 @@ class Microsoft::Terminal::Core::Terminal final : til::CoordType _scrollbackLines = 0; bool _detectURLs = false; bool _clipboardOperationsAllowed = true; + bool _isFocused = false; til::size _altBufferSize; std::optional _deferredResize; diff --git a/src/cascadia/TerminalCore/TerminalApi.cpp b/src/cascadia/TerminalCore/TerminalApi.cpp index 825712028ee..7d1fb34bf93 100644 --- a/src/cascadia/TerminalCore/TerminalApi.cpp +++ b/src/cascadia/TerminalCore/TerminalApi.cpp @@ -140,7 +140,8 @@ unsigned int Terminal::GetInputCodePage() const noexcept void Terminal::CopyToClipboard(wil::zwstring_view content) { - if (_clipboardOperationsAllowed) + // Only allow VT clipboard writes when the terminal has focus + if (_clipboardOperationsAllowed && _isFocused) { _pfnCopyToClipboard(content); } From 62531991d11d0a86faf27f5d2c85d36139103dbe Mon Sep 17 00:00:00 2001 From: Divyaranjan Sahoo Date: Fri, 19 Sep 2025 09:47:09 +0530 Subject: [PATCH 2/4] Add check in FocusChanged to avoid redundant HandleFocus calls --- .DS_Store | Bin 0 -> 8196 bytes src/cascadia/TerminalCore/Terminal.cpp | 12 ++++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4a007aa3265a4d0bc591a79109739fb440dc9a50 GIT binary patch literal 8196 zcmeHMO=}ZT6uqyLwy{;{qSPV^g9^GT7P?TZFqTL`5Uc$IZIU)ECY{g^5kv^Ma_2@6 zby-Bg?~SWMK~WG2-4rW`sJImOZi?r9WahrSMBLO5d=F-Bm~-ztXU@EtH*Z2jVq~c} zNYqb6S!^=)bYs_~NnCDDYcofN5e4drrfHT+<_qm%!=w zza(gE=Zm((9OD{Buf6R$r!^$Cl{jT@hI8Is%TFY)^g;2`3@uTfvy*sPa5K0Dx^MZw z`r%4iXK_6g9FclDpl1$BN;GAA0j$!9b1fSyi59C5uB26tr9(fAr7st0L5-0jO zOO2C&-~v@G?uQpvz-!ueKj+)nunnx3DFaz4s@lzdsL;^|Yy6)j+!YG9^4 z)6H_YhW&RF4NhPD?0=SL>C!JB0nIyV&L4ONH3s1tw)!5VKBzj*?4lOmrB!r_yJ&$X zac5WIMWYM7yFa@boPTrpQJue`AFiWymZhg}y{@MK4<>05S7yc@58q!IJuHLk**jtB zv9i+f(K^f0)1mYP@Mpf^J{Y_A6*>&U`G*dDsQZziDX)uiKCv9h^KZv_$7*ES_d?s~ zSsUfNU)Da=d09Qb2F)`#KV^C(|8}=P6ZFgV|EbpB|F>I)@83J%9r%L|h)ixgHv$1> zZS6>rYwZx*1UA`ZUQI_;f}Ko}$JKHiG5Ny~ze9sXCf0NWg7(`#1n6~w^PXTmf3;*Y X%UkoFpZ}}svITzrPu~vy#rgjSFSB;g literal 0 HcmV?d00001 diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 18e68b0026c..1179cb61d7e 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -783,10 +783,14 @@ TerminalInput::OutputType Terminal::SendCharEvent(const wchar_t ch, const WORD s // Return Value: // - none TerminalInput::OutputType Terminal::FocusChanged(const bool focused) -{ - _isFocused = focused; - return _getTerminalInput().HandleFocus(focused); -} + { + if (_isFocused != focused) + { + _isFocused = focused; + return _getTerminalInput().HandleFocus(focused); + } + return {}; + } // Method Description: // - Invalidates the regions described in the given pattern tree for the rendering purposes From 513606db96779714ef73dc7bb2b4a79a21bffd81 Mon Sep 17 00:00:00 2001 From: Divyaranjan Sahoo Date: Fri, 19 Sep 2025 10:16:04 +0530 Subject: [PATCH 3/4] Secure OSC 52 clipboard operations in conhost with focus check --- src/host/outputStream.cpp | 8 +++++++- tools/bx.cmd | 0 2 files changed, 7 insertions(+), 1 deletion(-) mode change 100644 => 100755 tools/bx.cmd diff --git a/src/host/outputStream.cpp b/src/host/outputStream.cpp index 5ef852065f4..7b1ee168d60 100644 --- a/src/host/outputStream.cpp +++ b/src/host/outputStream.cpp @@ -282,7 +282,13 @@ unsigned int ConhostInternalGetSet::GetInputCodePage() const // - void ConhostInternalGetSet::CopyToClipboard(const wil::zwstring_view content) { - ServiceLocator::LocateGlobals().getConsoleInformation().CopyTextToClipboard(content); + auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); + + // Only allow VT clipboard writes when the console has focus + if (WI_IsFlagSet(gci.Flags, CONSOLE_HAS_FOCUS)) + { + gci.CopyTextToClipboard(content); + } } // Routine Description: diff --git a/tools/bx.cmd b/tools/bx.cmd old mode 100644 new mode 100755 From f459e51910cc94a7c29cdcb18176a97a05053d2e Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Fri, 21 Nov 2025 13:40:28 +0100 Subject: [PATCH 4/4] Format files, Revert unrelated changes --- .DS_Store | Bin 8196 -> 0 bytes src/cascadia/TerminalCore/Terminal.cpp | 16 ++++++++-------- src/host/outputStream.cpp | 2 +- tools/bx.cmd | 0 4 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 .DS_Store mode change 100755 => 100644 tools/bx.cmd diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 4a007aa3265a4d0bc591a79109739fb440dc9a50..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMO=}ZT6uqyLwy{;{qSPV^g9^GT7P?TZFqTL`5Uc$IZIU)ECY{g^5kv^Ma_2@6 zby-Bg?~SWMK~WG2-4rW`sJImOZi?r9WahrSMBLO5d=F-Bm~-ztXU@EtH*Z2jVq~c} zNYqb6S!^=)bYs_~NnCDDYcofN5e4drrfHT+<_qm%!=w zza(gE=Zm((9OD{Buf6R$r!^$Cl{jT@hI8Is%TFY)^g;2`3@uTfvy*sPa5K0Dx^MZw z`r%4iXK_6g9FclDpl1$BN;GAA0j$!9b1fSyi59C5uB26tr9(fAr7st0L5-0jO zOO2C&-~v@G?uQpvz-!ueKj+)nunnx3DFaz4s@lzdsL;^|Yy6)j+!YG9^4 z)6H_YhW&RF4NhPD?0=SL>C!JB0nIyV&L4ONH3s1tw)!5VKBzj*?4lOmrB!r_yJ&$X zac5WIMWYM7yFa@boPTrpQJue`AFiWymZhg}y{@MK4<>05S7yc@58q!IJuHLk**jtB zv9i+f(K^f0)1mYP@Mpf^J{Y_A6*>&U`G*dDsQZziDX)uiKCv9h^KZv_$7*ES_d?s~ zSsUfNU)Da=d09Qb2F)`#KV^C(|8}=P6ZFgV|EbpB|F>I)@83J%9r%L|h)ixgHv$1> zZS6>rYwZx*1UA`ZUQI_;f}Ko}$JKHiG5Ny~ze9sXCf0NWg7(`#1n6~w^PXTmf3;*Y X%UkoFpZ}}svITzrPu~vy#rgjSFSB;g diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 1179cb61d7e..93009bcca4a 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -783,14 +783,14 @@ TerminalInput::OutputType Terminal::SendCharEvent(const wchar_t ch, const WORD s // Return Value: // - none TerminalInput::OutputType Terminal::FocusChanged(const bool focused) - { - if (_isFocused != focused) - { - _isFocused = focused; - return _getTerminalInput().HandleFocus(focused); - } - return {}; - } +{ + if (_isFocused != focused) + { + _isFocused = focused; + return _getTerminalInput().HandleFocus(focused); + } + return {}; +} // Method Description: // - Invalidates the regions described in the given pattern tree for the rendering purposes diff --git a/src/host/outputStream.cpp b/src/host/outputStream.cpp index 7b1ee168d60..a531266ec2a 100644 --- a/src/host/outputStream.cpp +++ b/src/host/outputStream.cpp @@ -283,7 +283,7 @@ unsigned int ConhostInternalGetSet::GetInputCodePage() const void ConhostInternalGetSet::CopyToClipboard(const wil::zwstring_view content) { auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); - + // Only allow VT clipboard writes when the console has focus if (WI_IsFlagSet(gci.Flags, CONSOLE_HAS_FOCUS)) { diff --git a/tools/bx.cmd b/tools/bx.cmd old mode 100755 new mode 100644