From 52a4acced8e2712cd5fc8811abeeea414b3197a0 Mon Sep 17 00:00:00 2001 From: Marko Winkler Date: Wed, 23 Apr 2025 21:31:38 +0200 Subject: [PATCH 1/4] Add interface validation and improve shell argument escaping - Introduced validateInterface() to ensure only existing network interfaces are used - Used escapeshellarg() for user-supplied interfaces in shell commands (iw, iwgetid) - Replaced direct usage of $_POST['interface'] with validated fallback to RASPI_WIFI_AP_INTERFACE - Improved code readability by reducing redundant assignments --- includes/functions.php | 17 +++++++++++++++++ includes/hostapd.php | 19 ++++++++++--------- includes/wifi_functions.php | 4 ++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/includes/functions.php b/includes/functions.php index 6ef53ea4..4f58feab 100755 --- a/includes/functions.php +++ b/includes/functions.php @@ -823,6 +823,23 @@ function loadFooterScripts($extraFooterScripts) } } +/** + * Validate whether the given network interface exists on the system. + * This function retrieves all currently available network interfaces using the `ip link show` command + * and checks if the provided interface name is in the list. + */ +function validateInterface($interface) +{ + // Retrieve all available network interfaces + $valid_interfaces = shell_exec('ip -o link show | awk -F": " \'{print $2}\''); + + // Convert to array (one interface per line) + $valid_interfaces = explode("\n", trim($valid_interfaces)); + + // Check if the provided interface exists in the list + return in_array($interface, $valid_interfaces, true); +} + /** * Returns ISO standard 2-letter country codes * diff --git a/includes/hostapd.php b/includes/hostapd.php index 99b24fe3..93386c5e 100755 --- a/includes/hostapd.php +++ b/includes/hostapd.php @@ -34,7 +34,7 @@ function DisplayHostAPDConfig() $reg_domain = shell_exec("iw reg get | grep -o 'country [A-Z]\{2\}' | awk 'NR==1{print $2}'"); - $cmd = "iw dev ".$_SESSION['ap_interface']." info | awk '$1==\"txpower\" {print $2}'"; + $cmd = "iw dev ".escapeshellarg($_SESSION['ap_interface'])." info | awk '$1==\"txpower\" {print $2}'"; exec($cmd, $txpower); $txpower = intval($txpower[0]); @@ -76,7 +76,7 @@ function DisplayHostAPDConfig() } exec('cat '. RASPI_HOSTAPD_CONFIG, $hostapdconfig); if (isset($_SESSION['wifi_client_interface'])) { - exec('iwgetid '.$_SESSION['wifi_client_interface']. ' -r', $wifiNetworkID); + exec('iwgetid '.escapeshellarg($_SESSION['wifi_client_interface']). ' -r', $wifiNetworkID); if (!empty($wifiNetworkID[0])) { $managedModeEnabled = true; } @@ -249,17 +249,18 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $reg_dom exec('sudo '.RASPI_CONFIG.'/hostapd/disablelog.sh'); } } + // set AP interface default, override for ap-sta & bridged options - $ap_iface = $_POST['interface']; // the hostap AP interface - $cli_iface = $_POST['interface']; // the wifi client interface - $session_iface = $_POST['interface']; // the interface that the UI needs to monitor for data usage etc. + $iface = validateInterface($_POST['interface']) ? $_POST['interface'] : RASPI_WIFI_AP_INTERFACE; + + $ap_iface = $iface; // the hostap AP interface + $cli_iface = $iface; // the wifi client interface + $session_iface = $iface; // the interface that the UI needs to monitor for data usage etc. if ($wifiAPEnable) { // for AP-STA we monitor the uap0 interface, which is always the ap interface. - $ap_iface = 'uap0'; - $session_iface = 'uap0'; + $ap_iface = $session_iface = 'uap0'; } if ($bridgedEnable) { // for bridged mode we monitor the bridge, but keep the selected interface as AP. - $session_iface = 'br0'; - $cli_iface = 'br0'; + $cli_iface = $session_iface = 'br0'; } // persist user options to /etc/raspap diff --git a/includes/wifi_functions.php b/includes/wifi_functions.php index f55e525a..ad0982a6 100755 --- a/includes/wifi_functions.php +++ b/includes/wifi_functions.php @@ -165,6 +165,10 @@ function getWifiInterface() $iface = $_SESSION['ap_interface'] = $arrHostapdConf['WifiInterface'] ?? RASPI_WIFI_AP_INTERFACE; + if (!validateInterface($iface)) { + $iface = RASPI_WIFI_AP_INTERFACE; + } + // check for 2nd wifi interface -> wifi client on different interface exec("iw dev | awk '$1==\"Interface\" && $2!=\"$iface\" {print $2}'", $iface2); $client_iface = $_SESSION['wifi_client_interface'] = empty($iface2) ? $iface : trim($iface2[0]); From 6899389a81cfeeec7e96f474dc701e5dc259b958 Mon Sep 17 00:00:00 2001 From: billz Date: Thu, 24 Apr 2025 04:46:41 -0700 Subject: [PATCH 2/4] Read/set wgInterface, update SaveWireGuardUpload(), enumerate interfaces --- includes/wireguard.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/includes/wireguard.php b/includes/wireguard.php index f6beb3dd..233dd33b 100755 --- a/includes/wireguard.php +++ b/includes/wireguard.php @@ -11,13 +11,14 @@ function DisplayWireGuardConfig() $parseFlag = true; if (!RASPI_MONITOR_ENABLED) { $optRules = isset($_POST['wgRules']) ? $_POST['wgRules'] : null; + $optInterface = isset($_POST['wgInterface']) ? $_POST['wgInterface'] : null; $optConf = isset($_POST['wgCnfOpt']) ? $_POST['wgCnfOpt'] : null; $optSrvEnable = isset($_POST['wgSrvEnable']) ? $_POST['wgSrvEnable'] : null; $optLogEnable = isset($_POST['wgLogEnable']) ? $_POST['wgLogEnable'] : null; if (isset($_POST['savewgsettings']) && $optConf == 'manual' && $optSrvEnable == 1 ) { SaveWireGuardConfig($status); } elseif (isset($_POST['savewgsettings']) && $optConf == 'upload' && is_uploaded_file($_FILES["wgFile"]["tmp_name"])) { - SaveWireGuardUpload($status, $_FILES['wgFile'], $optRules); + SaveWireGuardUpload($status, $_FILES['wgFile'], $optRules, $optInterface); } elseif (isset($_POST['savewgsettings']) && isset($_POST['wg_penabled']) ) { SaveWireGuardConfig($status); } elseif (isset($_POST['startwg'])) { @@ -77,12 +78,17 @@ function DisplayWireGuardConfig() } $peer_id = $peer_id ?? "1"; + // fetch available interfaces + exec("ip -o link show | awk -F': ' '{print $2}'", $interfaces); + sort($interfaces); + echo renderTemplate( "wireguard", compact( "status", "wg_state", "serviceStatus", "public_ip", + "interfaces", "optRules", "optLogEnable", "peer_id", @@ -110,9 +116,10 @@ function DisplayWireGuardConfig() * @param object $status * @param object $file * @param boolean $optRules + * @param string $optInterface * @return object $status */ -function SaveWireGuardUpload($status, $file, $optRules) +function SaveWireGuardUpload($status, $file, $optRules, $optInterface) { define('KB', 1024); $tmp_destdir = '/tmp/'; @@ -147,7 +154,7 @@ function SaveWireGuardUpload($status, $file, $optRules) $rules[] = 'PostDown = '.getDefaultNetValue('wireguard','server','PostDown'); $rules[] = ''; $rules = join(PHP_EOL, $rules); - $rules = preg_replace('/wlan0/m', $_SESSION['ap_interface'], $rules); + $rules = preg_replace('/wlan0/m', $optInterface, $rules); $tmp_contents = preg_replace('/^\s*$/ms', $rules, $tmp_contents, 1); file_put_contents($tmp_wgconfig, $tmp_contents); } From a09550bf73e9760f156c557976bb7db89ac84fd4 Mon Sep 17 00:00:00 2001 From: billz Date: Thu, 24 Apr 2025 04:47:43 -0700 Subject: [PATCH 3/4] Update template w/ interface select for PostUp/PostDown rules --- templates/wg/general.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/templates/wg/general.php b/templates/wg/general.php index bdc4d812..9b8b8246 100644 --- a/templates/wg/general.php +++ b/templates/wg/general.php @@ -35,17 +35,20 @@
/> - - "> + + ">

- iptables Postup and PostDown rules for the configured AP interface (%s)."), $_SESSION['ap_interface']) ?> + iptables Postup and PostDown rules for the interface selected below."); ?> +

+ +

-
+
From f614fa80dc5bd58a454e7ea66c0a6e4d5204ad20 Mon Sep 17 00:00:00 2001 From: billz Date: Thu, 24 Apr 2025 04:51:18 -0700 Subject: [PATCH 4/4] Update wg messages + compile .mo --- locale/en_US/LC_MESSAGES/messages.mo | Bin 45249 -> 45345 bytes locale/en_US/LC_MESSAGES/messages.po | 12 ++++++------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/en_US/LC_MESSAGES/messages.mo b/locale/en_US/LC_MESSAGES/messages.mo index 799128f8844724b6ba30de4743d4ba7139ef0641..222464ebfd72aa37824be912cc9bd358ef58711d 100644 GIT binary patch delta 8936 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 YLr+@D;`I8}`)Y&hdwZt^{67ZzFO=TNEC2ui diff --git a/locale/en_US/LC_MESSAGES/messages.po b/locale/en_US/LC_MESSAGES/messages.po index da8c34b3..208959ce 100644 --- a/locale/en_US/LC_MESSAGES/messages.po +++ b/locale/en_US/LC_MESSAGES/messages.po @@ -1355,14 +1355,14 @@ msgstr "Upload a WireGuard config" msgid "This option uploads and installs an existing WireGuard .conf file on this device." msgstr "This option uploads and installs an existing WireGuard .conf file on this device." -msgid "Apply iptables rules for AP interface" -msgstr "Apply iptables rules for AP interface" +msgid "Apply iptables rules to the selected interface" +msgstr "Apply iptables rules to the selected interface" -msgid "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on the AP interface." -msgstr "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on the AP interface." +msgid "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on a desired interface. The active AP interface is the default." +msgstr "Recommended if you wish to forward network traffic from the wg0 interface to clients connected on a desired interface. The active AP interface is the default." -msgid "This option adds iptables Postup and PostDown rules for the configured AP interface (%s)." -msgstr "This option adds iptables Postup and PostDown rules for the configured AP interface (%s)." +msgid "This option adds iptables Postup and PostDown rules for the interface selected below." +msgstr "This option adds iptables Postup and PostDown rules for the interface selected below." msgid "Select WireGuard configuration file (.conf)" msgstr "Select WireGuard configuration file (.conf)"