Árvore de dependências
As dependências diretas que você declara trazem outras, as transitivas; a maioria dos pacotes que você roda está fundo na árvore.
No seu manifesto (o package.json, ou o requirements.txt em Python) você lista só as dependências diretas: as que você mesmo escolheu. Cada uma delas traz as suas, que trazem as suas, formando uma árvore. Tudo que não está na primeira camada é transitivo: você nunca o escolheu, mas ele é instalado e executado igual.
Por isso um aviso pode apontar um pacote que não está no seu manifesto. Ele está lá embaixo, puxado por uma dependência direta. Para ver a árvore inteira, use npm ls --all (ou pipdeptree em Python): a indentação mostra quem puxa quem.
Exemplo: o manifesto lista config-loader, mas o aviso é sobre yaml-stream, que não aparece ali. A árvore mostra [email protected] -> [email protected]: a vulnerável é a transitiva yaml-stream. O conserto costuma ser subir a dependência direta (config-loader) para uma versão que já traga o yaml-stream corrigido, ou forçar a versão boa com um override.