Schowek to wygodne narzędzie, ale może być źródłem poważnych zagrożeń. W artykule wyjaśniamy, jak działa schowek, jakie są typowe ataki i jak się przed nimi chronić – zarówno w systemach operacyjnych, jak i aplikacjach webowych.
Schowek — proste narzędzie, poważne konsekwencje
Kopiuj, wklej — dwa skróty klawiaturowe, które wykonujemy dziesiątki razy dziennie. Schowek systemowy wydaje się tak trywialny, że nikt nie myśli o nim w kategoriach bezpieczeństwa. Tymczasem to właśnie przez schowek przechodzą numery kont bankowych, hasła, tokeny API, fragmenty kodu i dane osobowe. Złośliwe strony internetowe potrafią podmienić zawartość schowka bez wiedzy użytkownika. Menedżery haseł celowo czyszczą schowek po kilkunastu sekundach. A aplikacje webowe coraz częściej implementują przycisk „Kopiuj do schowka" — czasem bezpiecznie, czasem nie. W tym artykule przechodzę przez pułapki schowka, które widzę w codziennej pracy z aplikacjami webowymi i mobilnymi.
Jak działa schowek w systemach operacyjnych
Schowek to bufor pamięci zarządzany przez system operacyjny. W Windows, macOS i Linuxie działa podobnie: aplikacja zapisuje dane w schowku (w jednym lub kilku formatach jednocześnie — tekst, HTML, RTF, obraz), a inna aplikacja je odczytuje. W Linuxie (X11) istnieją dwa niezależne schowki: PRIMARY (zaznaczenie myszką + środkowy przycisk) i CLIPBOARD (Ctrl+C / Ctrl+V). Wayland uprościł ten model, ale nie wszystkie aplikacje obsługują go poprawnie.
Windows 10 i 11 oferują wieloschowek (Win+V) — historię skopiowanych elementów, którą można synchronizować między urządzeniami. To wygodne, ale oznacza, że skopiowane dane mogą przetrwać restart komputera i trafić do chmury Microsoftu. Jeśli kopiujesz dane wrażliwe (hasła, numery kart), wieloschowek warto wyłączyć lub przynajmniej ręcznie czyścić historię po pracy.
Clipboard API w przeglądarce — jak to działa od strony kodu
Nowoczesne przeglądarki udostępniają Clipboard API do programowego odczytu i zapisu schowka. Zapis (kopiowanie) jest prosty:
navigator.clipboard.writeText('tekst do skopiowania') .then(() => console.log('Skopiowano')) .catch(err => console.error('Błąd:', err));Metoda writeText() wymaga, żeby dokument miał fokus — nie da się skopiować czegoś w tle bez interakcji użytkownika. Starsza metoda document.execCommand('copy') jest oznaczona jako przestarzała (deprecated) i nie działa w niektórych kontekstach (np. w Web Workerach).
Odczyt schowka (navigator.clipboard.readText()) jest bardziej restrykcyjny — przeglądarka wyświetla użytkownikowi prompt z pytaniem o zgodę. To mechanizm Permissions API: strona musi uzyskać uprawnienie clipboard-read, zanim odczyta dane. Chrome, Edge i Firefox obsługują to od kilku wersji; Safari ma własne ograniczenia (zezwala na odczyt tylko w odpowiedzi na gest użytkownika).
Przy implementacji przycisku „Kopiuj do schowka" w aplikacjach webowych zawsze sprawdzamy dostępność API i dodajemy fallback. Wzorzec, który stosujemy: próba navigator.clipboard.writeText(), a w razie niepowodzenia — tworzenie tymczasowego <textarea>, zaznaczenie tekstu i document.execCommand('copy').
Paste-jacking — atak na schowek przez stronę internetową
Paste-jacking (clipboard hijacking) to technika, w której złośliwa strona podmienia zawartość schowka w momencie kopiowania. Użytkownik zaznacza i kopiuje fragment tekstu — np. polecenie terminala z tutoriala — ale w schowku ląduje zmodyfikowana wersja z dopisanym złośliwym kodem. Po wklejeniu do terminala polecenie wykonuje się natychmiast, jeśli zawiera znak nowej linii.
Mechanizm jest prosty: strona nasłuchuje zdarzenia copy i w handlerze podmienia dane przez event.clipboardData.setData(). Użytkownik nie widzi różnicy, bo zaznaczony tekst na stronie wygląda normalnie. Ten sam wektor działa przy kopiowaniu numerów kont bankowych — atakujący podmienia numer IBAN na własny, licząc na to, że użytkownik nie sprawdzi go po wklejeniu w formularzu przelewu. CERT Polska wielokrotnie ostrzegał przed tym typem ataków.
Jak się chronić
- Przed wklejeniem polecenia w terminalu sprawdź jego treść — wklej najpierw do edytora tekstowego.
- Przy przelewach bankowych zawsze weryfikuj końcówkę numeru konta po wklejeniu.
- Rozszerzenia przeglądarki (np. CopyGuard) mogą blokować nadpisywanie schowka przez strony.
- Jako programista: nie nasłuchuj zdarzenia
copyw celu modyfikacji danych — to zła praktyka UX i sygnał ostrzegawczy dla narzędzi bezpieczeństwa.
Schowek na urządzeniach mobilnych
Na Androidzie klawiatura GBoard (i większość alternatywnych klawiatur) oferuje wbudowaną historię schowka — skopiowane elementy są dostępne przez godzinę, a przypięte — bez limitu czasowego. iOS jest bardziej restrykcyjny: od iOS 16 system wyświetla powiadomienie, gdy aplikacja odczytuje schowek, a od iOS 14 — informuje użytkownika paskiem u góry ekranu. To reakcja Apple na odkrycie, że wiele popularnych aplikacji (TikTok, LinkedIn, Reddit) odczytywało schowek przy każdym uruchomieniu, potencjalnie przechwytując hasła i dane skopiowane z innych aplikacji.
Jeśli tworzysz aplikację mobilną, która korzysta ze schowka — odczytuj go tylko w odpowiedzi na jawną akcję użytkownika (np. kliknięcie „Wklej") i informuj, do czego dane zostaną użyte.
Miniatury zamiast oryginałów i formatowanie — drobne, ale irytujące pułapki
Kopiowanie obrazów ze stron internetowych przez „Kopiuj obraz" często przenosi do schowka miniaturę, a nie oryginał. Dzieje się tak, gdy przeglądarka wyświetla wersję przeskalowaną (atrybut srcset lub CSS max-width). Rozwiązanie: otwórz obraz w nowej karcie i kopiuj stamtąd.
Kopiowanie tekstu z Worda, PDF-a czy maila przenosi ukryte formatowanie: czcionki, kolory, style CSS. Wklejenie do edytora WYSIWYG powoduje chaos w layoucie. Skrót Ctrl+Shift+V (na Macu: Cmd+Shift+Option+V) wkleja jako czysty tekst, bez formatowania. W aplikacjach, które budujemy, konfigurujemy edytory rich-text tak, żeby domyślnie czyściły formatowanie przy wklejaniu — użytkownik może je przywrócić świadomie, ale nie dostaje go przypadkiem.
Co z tym zrobić u siebie
- Jeśli implementujesz „Kopiuj do schowka" — użyj
navigator.clipboard.writeText()z fallbackiem. Dodaj wizualne potwierdzenie (zmiana ikony, tooltip „Skopiowano"). - Nie odczytuj schowka użytkownika bez wyraźnej potrzeby —
clipboard-readto uprawnienie, które budzi podejrzenia. - W edytorach WYSIWYG filtruj HTML przy wklejaniu — usuń obce style, klasy i atrybuty.
- Edukuj użytkowników: sprawdzaj numer konta po wklejeniu, nie wklejaj poleceń do terminala bez weryfikacji. Jeśli budujesz system z formularzami obsługującymi dane wrażliwe — rozważ automatyczną walidację wklejanych IBAN-ów.
Źródła
- MDN — Clipboard API — dokumentacja API schowka w przeglądarkach, w tym Permissions API.
- CERT Polska — ostrzeżenie o atakach na schowek — opis realnych ataków clipboard hijacking w polskim internecie.
- OWASP — ataki przeglądarkowe — kontekst szerszych zagrożeń w przeglądarce, w tym manipulacji schowkiem.
- CSV — opanuj chaos cyferek i literek — powiązany artykuł o bezpieczeństwie danych przy eksporcie (CSV injection).