web-dev-qa-db-fra.com

Garde-fil: Quel est le problème avec cette assignation IP automatique

Wireguard est extrêmement simple et rapide VPN de l'espace noyau basé sur la cryptographie moderne. Je souhaite l'utiliser dans la production et j'ai besoin d'une affectation automatique de la propriété intellectuelle pour de nouveaux pairs. Le projet fournit deux courts scripts pour serveur et client qui font exactement cela. Cependant, il états :

N'utilisez pas ces scripts en production. Ils sont simplement une démonstration de la facilité d'utilisation de l'outil wg(8) à la ligne de commande, mais sans aucun moyen de tenter de les utiliser. Ils sont horriblement insécurités et vaincre le but du gardien. RESTE LOIN!

Les scripts sont:
[.____] serveur :

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) 2015-2018 Jason A. Donenfeld <[email protected]>. All Rights Reserved.

if [[ -z $NCAT_REMOTE_ADDR ]]; then
    ip link del dev wg0 2>/dev/null
    set -e
    ip link add dev wg0 type wireguard
    ip address add 192.168.4.1/24 dev wg0
    wg set wg0 private-key <(wg genkey) listen-port 12912
    ip link set up dev wg0
    exec ncat -e "$(readlink -f "$0")" -k -l -p 42912 -v
fi
read -r public_key
[[ $(wg show wg0 peers | wc -l) -ge 253 ]] && wg set wg0 peer $(wg show wg0 latest-handshakes | sort -k 2 -b -n | head -n 1 | cut -f 1) remove
next_ip=$(all="$(wg show wg0 allowed-ips)"; for ((i=2; i<=254; i++)); do ip="192.168.4.$i"; [[ $all != *$ip/32* ]] && echo $ip && break; done)
wg set wg0 peer "$public_key" allowed-ips $next_ip/32 2>/dev/null && echo "OK:$(wg show wg0 private-key | wg pubkey):$(wg show wg0 listen-port):$next_ip" || echo ERROR

Client :

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) 2015-2018 Jason A. Donenfeld <[email protected]>. All Rights Reserved.

set -e
[[ $UID == 0 ]] || { echo "You must be root to run this."; exit 1; }
umask 077
trap 'rm -f /tmp/wg_private_key' EXIT INT TERM
exec 3<>/dev/tcp/demo.wireguard.com/42912
wg genkey | tee /tmp/wg_private_key | wg pubkey >&3
IFS=: read -r status server_pubkey server_port internal_ip <&3
[[ $status == OK ]]
ip link del dev wg0 2>/dev/null || true
ip link add dev wg0 type wireguard
wg set wg0 private-key /tmp/wg_private_key peer "$server_pubkey" allowed-ips 0.0.0.0/0 endpoint "demo.wireguard.com:$server_port" persistent-keepalive 25
ip address add "$internal_ip"/24 dev wg0
ip link set up dev wg0
if [ "$1" == "default-route" ]; then
    Host="$(wg show wg0 endpoints | sed -n 's/.*\t\(.*\):.*/\1/p')"
    ip route add $(ip route get $Host | sed '/ via [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/{s/^\(.* via [0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/}' | head -n 1) 2>/dev/null || true
    ip route add 0/1 dev wg0
    ip route add 128/1 dev wg0
fi

Des questions:

  1. Quel est le problème avec ces scripts? Quel est le pire des cas?
  2. Existe-t-il un moyen de résoudre ces problèmes?
  3. Quelqu'un pourrait-il écrire un court commentaire ce que chaque ligne de ces scripts fait?

MISE À JOUR: L'auteur de Wireguard a déclaré que "le problème est qu'il utilise un TCP non authentifié". Alors, quel est le pire des cas et comment peut-il être corrigé? Peut-on fournir ceci TCP à l'intérieur d'un tunnel SSH?

5
user1876484

Le problème se résume à votre troisième point. Vous ne sais pas ce qu'il fait sans le lire en détail et qu'il contient beaucoup de code impur.

Il "fonctionne probablement", mais si quelque chose échoue, aucune gestion des erreurs n'est implémentée. De plus, l'écran informatique racle quelques utilitaires shell sans savoir si leur format de sortie est corrigé. Peut-être que vous mettez à niveau votre distribution, obtenez une nouvelle version de l'un des outils et soudainement, le script échoue.

Quel est le pire des cas

Une partie de l'analyse de sortie échoue et la commande suivante reçoit une sortie brouillée et supprime /home. Pas comme résultat réel de l'analyse du script, mais quelque chose qui pourrait se produire avec des scripts shell sans la manipulation d'erreur appropriée et a fait dans le passé (c'est-à-dire rm -r $uninitialized/*).

L'erreur la plus probable de se produire est de vous laisser avec un réseau brisé et que vous devez demander une explication du script (ce qui va bien. Je devrais l'étudier tout à fait avant de comprendre pleinement les risques). Cela vous obligerait probablement Pour redémarrer pour obtenir le système dans un état cohérent à nouveau.

Ceci n'est pas en sécurité , mais c'est bâclée et peut être peu sûr. Pour un script qui fonctionne comme une racine et des configurations, des choses importantes devraient faire preuve de traitement des erreurs pour chaque chose qui peut échouer.

Le concevoir général est que tout risque de ne pas être sûr que prouvé être sécurisé. Vous pouvez essayer de vérifier le script s'il est sécurisé, mais cela ne vaut pas la peine car il y a plusieurs anti-motifs (c'est-à-dire une sortie d'analyse qui n'est pas garantie (encore) d'être stable, de traiter les IP avec regex, aucun nettoyage lorsqu'une ligne échoue) qui permet de la réécrire de manière plus sécurisée.

Les gens peuvent par exemple s'appuyer sur le VPN pour empêcher d'envoyer des données de société confidentielles non chiffrées sur Internet. Lorsque le script VPN (silencieusement) n'a pas abouti à la mise en place du VPN, les données peuvent être envoyées sans précision.

Existe-t-il un moyen de résoudre ces problèmes?

Réécrivez-le avec une manipulation des erreurs prudentes après chaque commande. Probablement dans un langage mieux adapté que Bash et la lecture des données à l'aide d'une API au lieu de l'écran raclant d'autres programmes.

3
allo

Le pire des cas est que vous vous connectez directement à votre attaquant et lisez-la de lui.

Ce script relie votre coquille directement à un hôte extérieur appris uniquement de DNS, probablement à moitié dans le monde, ce qui pourrait ne pas être la fête que vous attendez, car un MITM sélectif fonctionnerait assez bien.

1
Matthias š