5

SCP, которым я давно пользуюсь для загрузки файлов, внезапно перестал работать. Я запустил сценарий 12 часов назад, и он работал просто отлично, но внезапно остановился.

Рассматриваемая команда загружала текущий каталог в удаленную папку:

#!/bin/bash
cd "$(dirname "$0")"

scp -r . <remote_server>:<remote_folder>

Сообщение об ошибке:

scp: error: unexpected filename: .

Я на Mac под управлением Мохаве 10.14.2.

ОБНОВЛЕНИЕ: я решил конкретную проблему, переписав команду для этого, но мне все равно было бы интересно узнать, что сломалось:

scp -r $(pwd) <remote_server>:<remote_folder>

2 ответа2

7

Виновником является CVE-2018-20685, описание которого:

В OpenSSH 7.9 scp.c в клиенте scp позволяет удаленным SSH-серверам обойти предполагаемые ограничения доступа через имя файла. или пустое имя файла. Влияние заключается в изменении разрешений целевого каталога на стороне клиента.

Это часть большего набора уязвимостей SCP. Цитирую оттуда:

обзор

Клиенты SCP от нескольких поставщиков подвержены воздействию вредоносного сервера scp, который выполняет несанкционированные изменения в целевом каталоге и / или манипулирует выходными данными клиента.

Описание

Многие клиенты scp не могут проверить, соответствуют ли объекты, возвращаемые сервером scp, тем, которые он запрашивал. Эта проблема восходит к 1983 и rcp, на котором основан scp. Отдельный недостаток в клиенте позволяет произвольно изменять атрибуты целевого каталога. Наконец, две уязвимости в клиентах могут позволить серверу подделать вывод клиента.

Совершить что заплата этой уязвимости в OpenBSD была сделана 16 ноября 2018 года

1

Другой ответ от @BlackBear объясняет, почему это больше не работает.

Но если вы, как и я, остановились на этом вопросе и в поисках решения, похоже, правильный путь сделать это - использовать rsync вместо scp . Например, одна из моих старых команд scp выглядела бы так:

# this no longer works due to the "."
scp -BCr output/html/. www:/var/www/site/html/

Теперь вместо этого я использую это:

rsync --recursive --times --compress --delete --progress output/html/ www:/var/www/site/html/

Если вы предпочитаете более короткие флаги, это будет выглядеть так:

rsync -rtz --del --progress output/html/ www:/var/www/site/html/

Трейлинг / источник важен. Он сообщает rsync, что вы хотите содержимое этого каталога без имени каталога.

Также рассмотрите --dry-run и man rsync перед тем, как все испортить.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .