Maven: Как обновить транзитивную зависимость (snakeyaml)?

Я просканировал свое приложение Spring Boot с помощью Synk, и после сканирования обнаружились некоторые уязвимости. По этой причине мне нужно было обновить snakeyaml, но, насколько я знаю, это зависимость ниже spring-boot-starter-web.

Вот дерево зависимостей для моего проекта:

[INFO] +- org.springframework.boot:spring-boot-starter-web:jar:2.7.5:compile
[INFO] |  +- org.springframework.boot:spring-boot-starter:jar:2.7.5:compile
[INFO] |  |  +- org.springframework.boot:spring-boot-starter-logging:jar:2.7.5:compile
[INFO] |  |  |  +- ch.qos.logback:logback-classic:jar:1.2.11:compile
[INFO] |  |  |  |  \- ch.qos.logback:logback-core:jar:1.2.11:compile
[INFO] |  |  |  +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.17.2:compile
[INFO] |  |  |  |  \- org.apache.logging.log4j:log4j-api:jar:2.17.2:compile
[INFO] |  |  |  \- org.slf4j:jul-to-slf4j:jar:1.7.36:compile
[INFO] |  |  +- jakarta.annotation:jakarta.annotation-api:jar:1.3.5:compile
[INFO] |  |  \- org.yaml:snakeyaml:jar:1.30:compile

В этой сцене, как я могу обновить змею? Должен ли я добавить аннотацию удаления ниже spring-boot-starter-web, а затем добавить следующую зависимость в pom.xml?

Я знаю, что в последней версии тоже есть уязвимость, но я просто хотел узнать, что мне делать в таких ситуациях (предположим, что последняя версия не имеет уязвимости)? Есть идеи?

<!-- https://mvnrepository.com/artifact/org.yaml/snakeyaml -->
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.33</version>
</dependency>

Обновите до Spring BOot 2.7.8 (который включает более новые версии и совместим с вашей текущей версией Spring Boot). В противном случае добавьте <snakeyaml.version>1.33</snakeyaml.version> в раздел <properties> помпона. Но лучше всего будет обновиться до последней версии Spring BOot в линейке 2.7.

M. Deinum 13.02.2023 15:22

Спасибо за ваши ответы, но что, если я не обновлю spring-boot-starter-web и просто хочу обновить змею? Не могли бы вы сделать шаги для этого?

user21099360 13.02.2023 21:23

Почему люди всегда бросают читать после первого предложения?! Я уже говорил, что нужно делать, чтобы обновить только змеиную мл -> В противном случае добавьте <snakeyaml.version>1.33</snakeyaml.version> в раздел <properties> pom, это буквально там, но, как уже говорилось, вам действительно следует обновить. Придерживаться одной и той же основной версии 2.7, как правило, не проблема при обновлении дополнительных версий, таких как 2.7.8, которые также включают в себя соответствующие зависимости и другие исправления CVE.

M. Deinum 14.02.2023 07:22

@M.Deinum Прежде чем задать вопрос, я попытался обновиться до 3.0.0, но в проекте много перерывов. Затем я попробовал ваше предложение, но все равно ошибка уязвимости: «Введено через: org.springframework.boot: [email protected] > org.springframework.boot: [email protected] > org .yaml:[email protected]" ---- Исправление: обновление до org.springframework.boot:[email protected]". >>>

user21099360 14.02.2023 08:53

@M.Deinum >>> Итак, вместо того, чтобы делиться своим предложением в комментариях, не могли бы вы опубликовать их в качестве ответа? Потому что у меня нет предыдущего опыта и я хочу знать 2 вещи: 1 Решить проблему наиболее правильным способом. 2. Как мне решить эту проблему при наличии транзитивной зависимости (думаю, мне может понадобиться сначала удалить змеиную мл, а затем добавить ее).

user21099360 14.02.2023 08:54

Самый правильный способ — обновить Spring Boot. Опять же, как указано, если это транзитивная зависимость, используйте тег версии, который я указал в разделе свойств. Это переопределит версию, которую загружает Spring Boot. ВАМ больше ничего делать не нужно (это даже объясняется в обычной документации Spring Boot).

M. Deinum 14.02.2023 09:44

Кроме того, вы не сделали, как я предложил, поскольку вы обновили часть весенней загрузки, которую я предложил не делать.

M. Deinum 14.02.2023 09:45

Обновление версии Spring Boot до 2.7.8 не решило проблему, как я уже говорил ранее. Но когда я добавляю <snakeyaml.version>1.33</snakeyaml.version> в раздел <properties>, вроде нормально. Мне просто интересно, когда есть транзитивная зависимость, должны ли мы просто добавить связанную зависимость в раздел <properties>? Или нам также нужно исключить эту зависимость из родительской зависимости (например, spring-boot-starter-web). Вы не уточнили по этому вопросу. Есть идеи? Большое спасибо.

user21099360 14.02.2023 11:56

Я сделал это в ответе, который дал... Что все объясняет.

M. Deinum 14.02.2023 14:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Попробуйте обновить все, что приносит вам зависимость (здесь: spring-boot-starter-web)

  2. Если это невозможно: добавьте запись в <dependencyManagement> с более новой версией и поместите комментарий в pom.xml, почему вы это делаете (уязвимость XY).

Обновление одной части Spring Boot — плохая идея, так как это приведет (в конечном итоге) к несовместимым версиям. Для использования определенной версии зависимости Spring Boot имеет задокументированные способы сделать это.

M. Deinum 13.02.2023 15:21

Если он предназначен для конкретной зависимости, как в таком случае, это имеет смысл и необходимо....... использование dependencyManagement работает нормально... в таком случае лучше всего было бы обновить саму загрузку spring... но это не так всегда можно...

khmarbaise 13.02.2023 16:09

Спасибо за ваши ответы, но что, если я не обновлю spring-boot-starter-web и просто хочу обновить змею? Не могли бы вы сделать шаги для этого?

user21099360 13.02.2023 21:22

@batman Это мой второй совет. Поместите змейку в <dependencyManagement>. В качестве альтернативы вы, вероятно, можете переопределить свойство, определяющее версию в родительском POM весенней загрузки.

J Fabian Meier 13.02.2023 22:49

@JFabianMeier Не могли бы вы опубликовать это в качестве примера? Потому что я понятия не имею, как это сделать правильно? Любой пример для pom.xml со связанными строками?

user21099360 14.02.2023 08:42
Ответ принят как подходящий

Прежде всего, не паникуйте и отступайте. Хотя упомянутая зависимость имеет уязвимость, если вы на самом деле ее не используете (т. е. в вашем приложении нет YAML), она на самом деле не применяется. Эти сканирования зависимостей довольно глупы, поскольку они могут видеть только зависимости, а не тот факт, что вы их используете или не используете.

При этом, чтобы исправить это, вы должны обновить версию Spring Boot для своего приложения. Для этого, если вы используете Spring Boot в качестве родителя, обновите эту версию.

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.7.8</version>
</parent>

ПРИМЕЧАНИЕ. Не смешивайте модули разных версий Spring Boot (или любых фреймворков/библиотек в этом отношении), так как это приведет к проблемам. Так что не ставьте тег version в свои зависимости (по крайней мере, не spring-boot-starter-*!).

У него есть Snake YAML 1.30, если вы можете, вы также можете обновить его до 3.0.2, который фактически включает версию 1.33.

Чтобы обновить только Snake YAML, вы можете просто переопределить свойство версии, используемое Spring Boot для управления зависимостями. Свойства версии задокументированы в Spring Boot Documentation . Как переопределить эти версии, описано в Документация по подключаемым модулям Spring Boot.

Короче говоря, вам нужно будет переопределить свойство snakeyaml.version версией, которую вы хотите использовать (это только для 2.7.x), если вы обновитесь до 3.02, вам это не нужно.

<properties>
 <snakeyaml.version>1.33</snakeyaml.version>
</properties>

Это потянет эту версию. Для этого не нужно ничего исключать или использовать управление зависимостями. Недостаток, когда выходит новая версия Snake YAML и Spring Boot использует ее, это переопределяет ее. Так что будьте осторожны при обновлении после этого.

Все это, как упоминалось в начале, тот факт, что включена определенная банка/зависимость, не означает, что это риск. Если его не использовать, он не будет представлять опасности, поэтому вместо того, чтобы паниковать из-за предупреждений Snyk, вы должны тщательно изучить их.

Очень хорошие, чистые и важные объяснения; гораздо полезнее, чем документация, и, пожалуйста, будьте уверены, что я принял к сведению все ваши объяснения и учту их. Большое спасибо! Что касается некоторых моментов, которые вы упомянули, не могли бы вы добавить некоторые комментарии по ним? >>>

user21099360 16.02.2023 08:07

1. Иногда я также думаю о правильном использовании свойства version в pom.xml. Тогда вы имеете в виду, что кроме некоторых основных полей, например. <java.version>, я не должен его использовать, не так ли?

user21099360 16.02.2023 08:07

2. Но есть некоторые зависимости, которые используют одну и ту же версию с соответствующими библиотеками Spring Boot, например. spring-boot-starter-validation, springfox-boot-starter. В этой сцене я должен изменить все версии одновременно, когда мне нужно изменить одну из них? Я имею в виду, что бы вы предложили для использования версии на pom.xml? Например, иногда мне нужно указать версию и, возможно, потребуется использовать более низкую версию для совместимости. Насколько я знаю, когда мы не используем версию, для этой зависимости используется последняя версия.

user21099360 16.02.2023 08:07

1. Вам следует избегать этого, насколько это возможно, по крайней мере, для управления/переопределения зависимостей Spring Boot. 2. Ваше знание неверно, оно использует указанную зависимость, которой можно управлять с помощью блока управления зависимостями из Spring BOot. Он не использует последнюю версию по умолчанию.

M. Deinum 16.02.2023 09:11

Другие вопросы по теме