Injeção de argumento
Mesmo sem shell, um valor que começa com hífen pode virar uma OPÇÃO do programa, mudando o que ele faz.
Passar os argumentos como lista (subprocess.run(["gust", name]), sem shell=True) fecha a injeção pelo shell: um ; no name seria só parte do nome, porque não há shell para lê-lo. Mas há uma injeção que sobra, mais sutil.
Quase todo programa de linha de comando lê os argumentos que começam com - como opções, não como dados. Se o seu valor é um argumento por conta própria e você consegue fazê-lo começar com -, ele pode virar uma opção que você não deveria controlar. Um programa que imprime arquivos com --read FILE, ou que tem um --token, passa a obedecer você.
O exemplo clássico é o programa chamar tool <valor> sem o separador --. Se valor é --token, a linha vira tool --token, e a opção dispara. Isso é injeção de argumento: você não injetou um comando novo, injetou uma flag de linha de comando no comando que já existia.
A defesa tem duas partes: pôr -- antes do valor do usuário (["tool", "--", valor]), que diz "daqui pra frente é dado, não opção", e validar o valor para ele nunca começar com -.