Введение
Приложения зависят от библиотек, написанных в других проектах. Полезная библиотека может иметь известную уязвимость, даже когда ваша программа выглядит исправной. Этот клиент заявок DeskLite использует уязвимую версию HTTP-библиотеки Python Requests.
Вы прочитаете фиксированное офлайн-уведомление об уязвимости, обновите пакет, который клиент действительно импортирует, и вместе проверите функциональность и записи версий. Изолированная среда Python, установочный кэш и учебный снимок с двумя уведомлениями уже подготовлены. Опыт управления пакетами или программирования на Python не требуется.
Запустите клиент и проверьте его пакет
На этом шаге вы установите текущее бизнес-поведение клиента и найдёте его установленную зависимость.
Зависимость — программное обеспечение, которое использует ваше приложение. Этот клиент напрямую использует requests для HTTP-запросов; сама Requests использует другую библиотеку, urllib3, для части этой работы. Такая вторая связь называется транзитивной зависимостью.
cd /home/labex/project/desklite-dependencies
.venv/bin/python — подготовленный изолированный исполняемый файл Python для этого проекта. Его пакеты отделены от системного Python. Команда активации или глобальная установка не нужны. Запустите предоставленный клиент так же, как запускали предоставленную программу в лабораторной работе по Git:
.venv/bin/python app.py
Ожидается исходная заявка с заголовком Printer offline. Программа работает до исправления безопасности; известная проблема зависимости не означает, что каждый запрос уже завершается неудачей.
pip управляет пакетами Python. -m pip указывает этому же изолированному Python запустить свой менеджер пакетов, а show читает метаданные, ничего не меняя:
.venv/bin/python -m pip show requests urllib3
Найдите Name, Version и Location. Requests должна иметь версию 2.32.3, urllib3 — 2.2.2, а расположение пакетов должно быть внутри .venv этого проекта. Мы обновим эту среду, а не другую установку Python.
Прочитайте результат офлайн-проверки уязвимостей
На этом шаге вы свяжете находку сканера с версией пакета, требующей внимания.
Подготовленная команда запуска course-deps запускает OSV-Scanner 2.7.0 с фиксированным локальным снимком от 2026-10-28. Этот намеренно небольшой снимок содержит два выбранных уведомления об уязвимостях Requests и urllib3; это учебные данные, а не полный актуальный поток уязвимостей для рабочей среды. Команда не делает сетевых запросов.
Передайте ей подготовленную запись зафиксированных версий:
course-deps requirements.lock
Ожидается строка с requests 2.32.3, GHSA-9hjg-9r4m-mvj7, CVE-2024-47081 и fixed: 2.32.4, за которой следует Security findings: 1. Два идентификатора обозначают одну и ту же проблему в разных системах уведомлений об уязвимостях.
Это уведомление касается возможной утечки учётных данных при взаимодействии некоторых специально сформированных URL с сохранёнными учётными данными клиента. Здесь не нужно воспроизводить атаку или настраивать такие учётные данные. Ваша задача — установить предоставленное совместимое исправление и сохранить обычные запросы.
Команда намеренно завершается с кодом 1, когда находит известную проблему. CHECK ERROR означает, что сканирование не удалось завершить, и сопровождается кодом 2; это не свидетельство безопасности. Оценка серьёзности помогает расставлять приоритеты проверки, но не показывает, что это приложение уже подверглось эксплуатации уязвимости.
Отчёт указывает исправленную версию. Далее вы свяжете этот отчёт с файлами, используемыми для установки и воспроизводимости.
Отличите требования от установленного состояния
На этом шаге вы прочитаете список установки с закреплёнными версиями и запись разрешённой среды.
cat requirements.txt
Каждая строка имеет вид package==version. Двойной знак равенства закрепляет пакет за одной версией. Список курса включает как прямую зависимость, так и её разрешённые вспомогательные пакеты, чтобы установку можно было воспроизвести офлайн.
Requests закреплена на 2.32.3. Сканирование указало 2.32.4 как совместимое исправление, доступное в кэше. Сохраните все остальные строки.
cat requirements.lock
Запись зафиксированных версий описывает точные разрешённые версии пакетов. Здесь это простой файл в формате requirements с полностью закреплёнными версиями. Изначально он совпадает со списком установки. После обновления вы пересоздадите его из реальной среды вместо утверждения, что пакет изменился лишь от редактирования текста.
Есть три отдельных состояния: требуемые версии в requirements.txt, реальные пакеты внутри .venv и запись разрешённых версий в requirements.lock. При передаче все они должны совпадать. Сканер читает указанный вами файл; он не доказывает автоматически, что работающее приложение импортирует эти версии.
Кэш в /opt/labex-dependency-tools/wheels содержит подготовленные исходные и исправленные пакеты. Вы установите их из этого кэша, поэтому искать версии в Интернете или решать конфликты зависимостей не требуется.
Установите совместимую исправленную версию
На этом шаге вы обновите список установки и установите исправленный пакет в реальную среду проекта.
nano requirements.txt
Измените только requests==2.32.3 на requests==2.32.4. Сохраните все остальные закреплённые версии. Сохраните файл с помощью Ctrl+O, Enter, Ctrl+X.
Теперь используйте менеджер пакетов той же среды. install меняет установленные пакеты; -r requirements.txt читает указанный список установки. --no-index отключает сетевые индексы пакетов, а --find-links указывает pip на подготовленные wheel-файлы. Wheel — заранее собранный установочный пакет Python:
.venv/bin/python -m pip install --no-index --find-links /opt/labex-dependency-tools/wheels -r requirements.txt
Pip должен заменить Requests 2.32.3 на 2.32.4, сохранив выполнение требований для остальных закреплённых пакетов. Оценивайте указанное изменение версии; сообщения о ходе работы могут отличаться. Не запускайте обычный системный pip, поскольку он может обновить другую среду.
.venv/bin/python -m pip show requests
Ожидаются Version: 2.32.4 и расположение внутри .venv этого проекта. Одно сохранение списка не подтвердило бы это установленное состояние. Клиент — однократно запускаемая программа, импортирующая пакеты при каждом запуске, поэтому последующие запросы будут использовать обновлённую среду.
Пересоздайте запись зафиксированных версий
На этом шаге вы сделаете так, чтобы запись разрешённых версий описывала реально установленные пакеты.
pip freeze выводит закреплённые версии установленных пакетов среды. Оператор оболочки > записывает этот вывод в файл вместо терминала, заменяя предыдущее содержимое файла. Здесь целевой файл — именно запись зафиксированных версий проекта:
.venv/bin/python -m pip freeze > requirements.lock
Обычно команда ничего не выводит, потому что её вывод попал в файл. Прочитайте его:
cat requirements.lock
Теперь Requests должна иметь версию 2.32.4; версии остальных зависимостей должны остаться прежними. Порядок или регистр букв могут отличаться, не меняя того, какие пакеты записаны.
Проверьте совместимость пакетов с помощью pip check, который проверяет объявленные связи зависимостей:
.venv/bin/python -m pip check
Ожидается No broken requirements found. Это проверяет совместимость пакетов, а не бизнес-поведение приложения или все возможные уязвимости.
Теперь у вас согласованы намерение установки, установленные пакеты и запись разрешённых версий. Lock-файл — реальный артефакт воспроизводимости, а не скопированный отчёт, доказывающий запуск команды. Допустимый эквивалентный способ получения тех же точных закреплённых версий также удовлетворяет требуемому результату.
Запустите функциональную регрессионную проверку
На этом шаге вы убедитесь, что обновление библиотеки сохранило исходные запрос и ответ.
Регрессия — ранее работавшее поведение, нарушенное изменением. Курс предоставляет test.sh, небольшую функциональную проверку исходного клиента. Вы учитесь запускать эту проверку; написание тестов будет позже.
bash test.sh
Ожидается:
PASS: original ticket request and response.
Проверка действительно запускает клиент с локальным сервисом заявок и сравнивает возвращённые данные. Она не принимает изменённую строку версии за успех бизнес-функции.
Ещё раз запустите клиент самостоятельно:
.venv/bin/python app.py
Ожидается исходная заявка с идентификатором 1 и заголовком Printer offline. Ни удаление клиента, ни удаление его зависимости не сохранило бы это поведение.
Библиотека обновлена на диске, и этот заново запущенный клиент импортирует её. Долго работающим приложениям после обновления зависимостей может требоваться собственный управляемый перезапуск; клиент этой лабораторной работы каждый раз запускается заново. Последний шаг повторно проверяет известную проблему по точной записи зафиксированных версий.
Повторно просканируйте передаваемое состояние зависимостей
На этом шаге вы объедините сканирование по фиксированному снимку с подтверждениями установленных пакетов и работы бизнес-функции.
Запустите тот же офлайн-сканер для обновлённой записи зафиксированных версий:
course-deps requirements.lock
Ожидается No findings in the selected course snapshot. Это означает именно то, что выбранные уведомления об уязвимостях больше не соответствуют записанным версиям. Это не доказывает, что снимок охватывает каждую существующую или будущую проблему.
Проверьте требуемую закреплённую версию и реальный установленный пакет:
cat requirements.txt
.venv/bin/python -m pip show requests
Requests должна иметь версию 2.32.4 в файле и среде; остальные закреплённые версии сохранены. Функциональная проверка предыдущего шага доказывает выполнение другого требования: обновлённый клиент по-прежнему выполняет исходный запрос.
Полное исправление требует обоих видов подтверждений. Редактирование только манифеста могло бы оставить уязвимую установку в работе. Обновление установки без записи сделало бы последующее воспроизведение ненадёжным. Пропуск сканера или удаление зависимости скрыло бы свидетельства вместо исправления требуемого приложения.
Документ исследования или скопированный отчёт сканера не требуется. Результаты вашей работы — реально обновлённая среда пакетов, точные записи закреплённых версий и сохранённое бизнес-поведение.
Резюме
Вы связали офлайн-уведомление об уязвимости с реально установленной зависимостью Python, установили совместимый исправленный пакет из подготовленного кэша и согласовали записи требуемых и разрешённых версий. Новое сканирование и реальный функциональный запрос подтвердили целевое исправление и сохранение поведения в явно заданных пределах учебного снимка.



