As discussed in #7832, ipsec-tools is no longer suitable for inclusion in the distribution. Signed-off-by: Noah Meyerhans <frodo@morgul.net>lilik-openwrt-22.03
@ -1,103 +0,0 @@ | |||
# | |||
# Copyright (C) 2006-2015 OpenWrt.org | |||
# 2014 Noah Meyerhans <frodo@morgul.net> | |||
# | |||
# This is free software, licensed under the GNU General Public License v2. | |||
# See /LICENSE for more information. | |||
# | |||
include $(TOPDIR)/rules.mk | |||
include $(INCLUDE_DIR)/kernel.mk | |||
PKG_NAME:=ipsec-tools | |||
PKG_VERSION:=0.8.2 | |||
PKG_RELEASE:=9 | |||
PKG_MAINTAINER:=Noah Meyerhans <frodo@morgul.net>, \ | |||
Vitaly Protsko <villy@sft.ru> | |||
PKG_LICENSE := BSD-3-Clause | |||
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 | |||
PKG_SOURCE_URL:=@SF/ipsec-tools | |||
PKG_HASH:=8eb6b38716e2f3a8a72f1f549c9444c2bc28d52c9536792690564c74fe722f2d | |||
PKG_BUILD_PARALLEL:=1 | |||
PKG_INSTALL:=1 | |||
PKG_FIXUP:=autoreconf | |||
include $(INCLUDE_DIR)/package.mk | |||
define Package/ipsec-tools | |||
SECTION:=net | |||
CATEGORY:=Network | |||
SUBMENU:=VPN | |||
DEPENDS:=+libopenssl +kmod-ipsec | |||
TITLE:=IPsec management tools | |||
URL:=http://ipsec-tools.sourceforge.net/ | |||
MAINTAINER:=Noah Meyerhans <frodo@morgul.net> | |||
endef | |||
CONFIGURE_ARGS += \ | |||
--enable-shared \ | |||
--enable-static \ | |||
--with-kernel-headers="$(LINUX_DIR)/include" \ | |||
--without-readline \ | |||
--with-openssl="$(STAGING_DIR)/usr" \ | |||
--without-libradius \ | |||
--without-libpam \ | |||
--enable-dpd \ | |||
--enable-hybrid \ | |||
--enable-security-context=no \ | |||
--enable-natt \ | |||
--enable-adminport \ | |||
--enable-frag \ | |||
$(call autoconf_bool,CONFIG_IPV6,ipv6) | |||
# override CFLAGS holding "-Werror" that break builds on compile warnings | |||
MAKE_FLAGS+=\ | |||
CFLAGS="$(TARGET_CFLAGS) $(EXTRA_CFLAGS) $(TARGET_CPPFLAGS) $(EXTRA_CPPFLAGS)" | |||
define Build/Prepare | |||
$(call Build/Prepare/Default) | |||
chmod -R u+w $(PKG_BUILD_DIR) | |||
endef | |||
define Build/Configure | |||
(cd $(PKG_BUILD_DIR); touch \ | |||
configure.ac \ | |||
aclocal.m4 \ | |||
Makefile.in \ | |||
config.h.in \ | |||
configure \ | |||
); | |||
$(call Build/Configure/Default) | |||
ifndef CONFIG_SHADOW_PASSWORDS | |||
echo "#undef HAVE_SHADOW_H" >> $(PKG_BUILD_DIR)/config.h | |||
endif | |||
endef | |||
define Package/ipsec-tools/install | |||
$(INSTALL_DIR) $(1)/etc/racoon | |||
$(INSTALL_CONF) ./files/functions.sh $(1)/etc/racoon/ | |||
$(INSTALL_BIN) ./files/p1client-up $(1)/etc/racoon/ | |||
$(INSTALL_BIN) ./files/p1client-down $(1)/etc/racoon/ | |||
$(INSTALL_BIN) ./files/vpnctl $(1)/etc/racoon/ | |||
$(INSTALL_DIR) $(1)/etc/init.d | |||
$(INSTALL_BIN) ./files/racoon.init $(1)/etc/init.d/racoon | |||
$(INSTALL_DIR) $(1)/etc/config | |||
$(INSTALL_CONF) ./files/racoon $(1)/etc/config/ | |||
$(INSTALL_DIR) $(1)/usr/lib | |||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libipsec.so.* $(1)/usr/lib/ | |||
$(CP) $(PKG_INSTALL_DIR)/usr/lib/libracoon.so.* $(1)/usr/lib/ | |||
$(INSTALL_DIR) $(1)/usr/sbin | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/plainrsa-gen $(1)/usr/sbin/ | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/racoon $(1)/usr/sbin/ | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/racoonctl $(1)/usr/sbin/ | |||
$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/setkey $(1)/usr/sbin/ | |||
endef | |||
define Package/ipsec-tools/conffiles | |||
/etc/config/racoon | |||
endef | |||
$(eval $(call BuildPackage,ipsec-tools)) |
@ -1,172 +0,0 @@ | |||
#!/bin/sh | |||
# | |||
# Copyright (C) 2015 Vitaly Protsko <villy@sft.ru> | |||
errno=0 | |||
get_fieldval() { | |||
local __data="$3" | |||
local __rest | |||
test -z "$1" && return | |||
while true ; do | |||
__rest=${__data#* } | |||
test "$__rest" = "$__data" && break | |||
if [ "${__data/ *}" = "$2" ]; then | |||
eval "$1=${__rest/ *}" | |||
break | |||
fi | |||
__data="$__rest" | |||
done | |||
} | |||
manage_fw() { | |||
local cmd=/usr/sbin/iptables | |||
local mode | |||
local item | |||
if [ -z "$4" ]; then | |||
$log "Bad usage of manage_fw" | |||
errno=3; return 3 | |||
fi | |||
case "$1" in | |||
add|up|1) mode=A ;; | |||
del|down|0) mode=D ;; | |||
*) return 3 ;; | |||
esac | |||
for item in $4 ; do | |||
$cmd -$mode forwarding_$2_rule -s $item -j ACCEPT | |||
$cmd -$mode output_$3_rule -d $item -j ACCEPT | |||
$cmd -$mode forwarding_$3_rule -d $item -j ACCEPT | |||
$cmd -t nat -$mode postrouting_$3_rule -d $item -j ACCEPT | |||
done | |||
} | |||
manage_sa() { | |||
local spdcmd | |||
local rtcmd | |||
local gate | |||
local litem | |||
local ritem | |||
if [ -z "$4" ]; then | |||
$log "Bad usage of manage_sa" | |||
errno=3; return 3 | |||
fi | |||
case "$1" in | |||
add|up|1) spdcmd=add; rtcmd=add ;; | |||
del|down|0) spdcmd=delete; rtcmd=del ;; | |||
*) errno=3; return 3 ;; | |||
esac | |||
get_fieldval gate src "$(/usr/sbin/ip route get $4)" | |||
if [ -z "$gate" ]; then | |||
$log "Can not find outbound IP for $4" | |||
errno=3; return 3 | |||
fi | |||
for litem in $2 ; do | |||
for ritem in $3 ; do | |||
echo " | |||
spd$spdcmd $litem $ritem any -P out ipsec esp/tunnel/$gate-$4/require; | |||
spd$spdcmd $ritem $litem any -P in ipsec esp/tunnel/$4-$gate/require; | |||
" | /usr/sbin/setkey -c 1>&2 | |||
done | |||
done | |||
test -n "$5" && gate=$5 | |||
for ritem in $3 ; do | |||
(sleep 3; /usr/sbin/ip route $rtcmd $ritem via $gate) & | |||
done | |||
} | |||
manage_nonesa() { | |||
local spdcmd | |||
local item | |||
local cout cin | |||
if [ -z "$4" ]; then | |||
$log "Bad usage of manage_nonesa" | |||
errno=3; return 3 | |||
fi | |||
case "$1" in | |||
add|up|1) spdcmd=add ;; | |||
del|down|0) spdcmd=delete ;; | |||
*) errno=3; return 3 ;; | |||
esac | |||
case "$2" in | |||
local|remote) ;; | |||
*) errno=3; return 3 ;; | |||
esac | |||
for item in $3 ; do | |||
if [ "$2" = "local" ]; then | |||
cout="$4 $item" | |||
cin="$item $4" | |||
else | |||
cout="$item $4" | |||
cin="$4 $item" | |||
fi | |||
echo " | |||
spd$spdcmd $cout any -P out none; | |||
spd$spdcmd $cin any -P in none; | |||
" | /usr/sbin/setkey -c 1>&2 | |||
done | |||
} | |||
. /lib/functions/network.sh | |||
get_zoneiflist() { | |||
local item | |||
local data | |||
local addr | |||
item=0 | |||
data=$(uci get firewall.@zone[0].name) | |||
while [ -n "$data" ]; do | |||
test "$data" = "$1" && break | |||
let "item=$item+1" | |||
data=$(uci get firewall.@zone[$item].name) | |||
done | |||
if [ -z "$data" ]; then | |||
errno=1 | |||
return $errno | |||
fi | |||
data=$(uci get firewall.@zone[$item].network) | |||
echo "$data" | |||
} | |||
get_zoneiplist() { | |||
local item | |||
local addr | |||
local data | |||
local result | |||
data=$(get_zoneiflist $1) | |||
test $? -gt 0 -o $errno -gt 0 -o -z "$data" && return $errno | |||
for item in $data ; do | |||
if network_is_up $item ; then | |||
network_get_ipaddrs addr $item | |||
test $? -eq 0 && result="$result $addr" | |||
fi | |||
done | |||
result=$(echo $result) | |||
echo "$result" | |||
} | |||
# EOF /etc/racoon/functions.sh |
@ -1,41 +0,0 @@ | |||
#!/bin/sh | |||
# | |||
log="logger -t p1client-down[$$]" | |||
. /lib/functions.sh | |||
. /etc/racoon/functions.sh | |||
if [ -z "$SPLIT_INCLUDE_CIDR" ]; then | |||
$log "Connection without server-pushed routing is not supported" | |||
exit 1 | |||
fi | |||
$log "Shutting down tunnel to server $REMOTE_ADDR" | |||
$log "Closing tunnel(-s) to $SPLIT_INCLUDE_CIDR through $INTERNAL_ADDR4" | |||
config_load racoon | |||
config_get confIntZone racoon int_zone lan | |||
config_get confExtZone racoon ext_zone wan | |||
manage_fw del $confIntZone $confExtZone "$INTERNAL_ADDR4 $SPLIT_INCLUDE_CIDR" | |||
data=$(get_zoneiflist $confIntZone) | |||
if [ -n "$data" ]; then | |||
for item in $data ; do | |||
network_get_subnet locnet $item | |||
if [ -n "$locnet" ]; then | |||
manage_sa del "$locnet" "$SPLIT_INCLUDE_CIDR" $REMOTE_ADDR $INTERNAL_ADDR4 | |||
else | |||
$log "Can not find subnet on interface $item" | |||
fi | |||
done | |||
else | |||
$log "Can not find subnets in zone $confIntZone" | |||
fi | |||
get_fieldval data dev "$(/usr/sbin/ip route get $REMOTE_ADDR)" | |||
ip address del $INTERNAL_ADDR4/32 dev $data | |||
# EOF /etc/racoon/p1client-down |
@ -1,41 +0,0 @@ | |||
#!/bin/sh | |||
# | |||
log="logger -t p1client-up[$$]" | |||
. /lib/functions.sh | |||
. /etc/racoon/functions.sh | |||
if [ -z "$SPLIT_INCLUDE_CIDR" ]; then | |||
$log "Connection without server-pushed routing is not supported" | |||
exit 1 | |||
fi | |||
$log "Setting up tunnel to server $REMOTE_ADDR" | |||
$log "Making tunnel(-s) to $SPLIT_INCLUDE_CIDR through $INTERNAL_ADDR4" | |||
get_fieldval data dev "$(/usr/sbin/ip route get $REMOTE_ADDR)" | |||
ip address add $INTERNAL_ADDR4/32 dev $data | |||
config_load racoon | |||
config_get confIntZone racoon int_zone lan | |||
config_get confExtZone racoon ext_zone wan | |||
data=$(get_zoneiflist $confIntZone) | |||
if [ -n "$data" ]; then | |||
for item in $data ; do | |||
network_get_subnet locnet $item | |||
if [ -n "$locnet" ]; then | |||
manage_sa add "$locnet" "$SPLIT_INCLUDE_CIDR" $REMOTE_ADDR $INTERNAL_ADDR4 | |||
else | |||
$log "Can not find subnet on interface $item" | |||
fi | |||
done | |||
else | |||
$log "Can not find interfaces in zone $confIntZone" | |||
fi | |||
manage_fw add $confIntZone $confExtZone "$INTERNAL_ADDR4 $SPLIT_INCLUDE_CIDR" | |||
# EOF /etc/racoon/p1client-up |
@ -1,113 +0,0 @@ | |||
#/etc/config/racoon | |||
# | |||
# Copyright 2015 Vitaly Protsko <villy@sft.ru> | |||
# * WARNING: this is "not working" example | |||
# * Defaults are commented out | |||
# * Resuting config will appear in /var/racoon/ | |||
config racoon | |||
# option debug 0 | |||
# option ext_zone 'wan' | |||
# option int_zone 'lan' | |||
# option port 500 | |||
# option natt_port 4500 | |||
# following 4 or 6, no default | |||
# option ipversion 4 | |||
config p1_proposal 'example_prop1' | |||
# option lifetime 28800 | |||
option enc_alg 'aes' | |||
option hash_alg 'sha1' | |||
option auth_method 'rsasig' | |||
option dh_group 2 | |||
config p1_proposal 'example_anon' | |||
# option lifetime 28800 | |||
option enc_alg 'aes' | |||
option hash_alg 'sha1' | |||
option auth_method 'xauth_rsa_server' | |||
option dh_group 2 | |||
config p1_proposal 'example_xauth' | |||
# option lifetime 28800 | |||
option enc_alg 'aes' | |||
option hash_alg 'sha1' | |||
option auth_method 'xauth_rsa_client' | |||
option dh_group 2 | |||
config p2_proposal 'example_prop2' | |||
option pfs_group 2 | |||
option enc_alg 'aes' | |||
option auth_alg 'hmac_sha1' | |||
config p2_proposal 'example_in2' | |||
option pfs_group 2 | |||
# option lifetime 14400 | |||
option enc_alg 'aes' | |||
option auth_alg 'hmac_sha1' | |||
config sainfo 'office' | |||
option p2_proposal 'example_prop2' | |||
option local_net '192.168.8.0/24' | |||
option remote_net '192.168.1.0/24' | |||
# you can exclude some local or remote | |||
# addresses from SA rules | |||
list local_exclude '192.168.8.0/30' | |||
list remote_exclude '192.168.1.128/29' | |||
config sainfo 'welcome' | |||
option p2_proposal 'example_in2' | |||
option local_net '192.168.8.0/24' | |||
option remote_net '192.168.10.0/24' | |||
option dns4 '192.168.8.1' | |||
option defdomain 'myhome.local' | |||
config sainfo 'client' | |||
option p2_proposal 'std_p2' | |||
config tunnel 'Office' | |||
option enabled 1 | |||
# initial_contact | |||
# option init 1 | |||
option remote 'vpn.example.tld' | |||
option exchange_mode 'main' | |||
option certificate 'example_cert' | |||
# option peer_id_type 'asn1dn' | |||
# option prop_check 'obey' | |||
# option verify_id 1 | |||
# option weak_p1check 1 | |||
# option dpd_delay '' | |||
list p1_proposal 'example_prop1' | |||
list sainfo 'office' | |||
# WARNING: Only ONE tunnel with remote anonymous | |||
# can be configured and it can have only | |||
# ONE sainfo. Otherwise resulting racoon | |||
# configuration will be unusable | |||
config tunnel 'Incoming' | |||
option enabled 1 | |||
option remote 'anonymous' | |||
option pre_shared_key 'testitnow' | |||
option exchange_mode 'aggressive,main' | |||
option my_id_type 'fqdn' | |||
option my_id 'myserver.homeip.net' | |||
list p1_proposal 'example_anon' | |||
list sainfo 'welcome' | |||
config tunnel 'Client' | |||
option enabled 1 | |||
option remote 'vpn.example.tld' | |||
option username 'testuser' | |||
option password 'testW0rD' | |||
# option mode_cfg 1 | |||
list p1_proposal 'example_xauth' | |||
list sainfo 'client' | |||
# Insert corresponding data in PEM format as one line | |||
config 'certificate' 'example_cert' | |||
option 'key' '-----BEGIN PRIVATE KEY----- ~ -----END PRIVATE KEY-----' | |||
option 'crt' '-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE-----' | |||
config 'certificate' 'example_ca_cert' | |||
option 'crt' '-----BEGIN CERTIFICATE----- ~ -----END CERTIFICATE-----' |
@ -1,479 +0,0 @@ | |||
#!/bin/sh /etc/rc.common | |||
# | |||
# Copyright (C) 2015 Vitaly Protsko <villy@sft.ru> | |||
#set -vx | |||
USE_PROCD=1 | |||
START=60 | |||
STOP=40 | |||
let connWait=2/2 | |||
confDir=/var/racoon | |||
confExtZone= | |||
confIntZone= | |||
confPort= | |||
confNATPort= | |||
confIPMode= | |||
confPh1ID=0 | |||
log="logger -t init.d/racoon[$$] " | |||
. /etc/racoon/functions.sh | |||
setup_load() { | |||
config_get confExtZone "$1" ext_zone wan | |||
config_get confIntZone "$1" int_zone lan | |||
config_get confPort "$1" port 500 | |||
config_get confNATPort "$1" natt_port 4500 | |||
config_get confIPMode "$1" ipversion "" | |||
case X$confIPMode in | |||
X4|X6) ;; | |||
*) unset confIPMode ;; | |||
esac | |||
} | |||
write_header() { | |||
echo " | |||
# autogenerated, don't edit, look at /etc/config/racoon | |||
# | |||
path certificate \"$confDir/cert\"; | |||
path script \"/etc/racoon\"; | |||
path pre_shared_key \"$confDir/psk.txt\"; | |||
path pidfile \"$confDir/racoon.pid\"; | |||
padding { maximum_length 20; randomize off; strict_check off; exclusive_tail off; } | |||
timer { counter 5; interval 20 sec; persend 1; phase1 30 sec; phase2 15 sec; } | |||
" | |||
} | |||
setup_conf() { | |||
local conf=$confDir/racoon.conf | |||
local peerconf=$confDir/peers.txt | |||
local pskconf=$confDir/psk.txt | |||
local item | |||
local data | |||
data="$(get_zoneiplist $confExtZone)" | |||
if [ "X$data" = X ]; then | |||
$log "No IP addresses found for zone $confExtZone, exitng" | |||
errno=2; return 2 | |||
fi | |||
write_header > $conf | |||
echo -n > $peerconf | |||
echo -n > $pskconf | |||
chmod 0600 $conf $peerconf $pskconf | |||
echo "listen {" >> $conf | |||
for item in $data ; do | |||
echo " isakmp $item [$confPort]; isakmp_natt $item [$confNATPort];" >> $conf | |||
done | |||
echo "}" >> $conf | |||
config_get_bool item "$1" debug 0 | |||
data=warning | |||
test $item -ne 0 && data=debug | |||
echo "log $data;" >> $conf | |||
setup_fw add | |||
} | |||
setup_p1() { | |||
local conf=$confDir/racoon.conf | |||
local data | |||
echo " proposal {" >> $conf | |||
config_get data "$1" lifetime 28800 | |||
echo " lifetime time $data sec;" >> $conf | |||
config_get data "$1" enc_alg | |||
test -n "$data" && echo " encryption_algorithm $data;" >> $conf | |||
config_get data "$1" hash_alg | |||
test -n "$data" && echo " hash_algorithm $data;" >> $conf | |||
config_get data "$1" auth_method | |||
test -n "$data" && echo " authentication_method $data;" >> $conf | |||
config_get data "$1" dh_group 2 | |||
echo -e " dh_group $data;\n }" >> $conf | |||
} | |||
setup_fw() { | |||
local cmd=/usr/sbin/iptables | |||
local mode | |||
case "$1" in | |||
add|up|1) mode=A ;; | |||
del|down|0) mode=D ;; | |||
*) return 3 ;; | |||
esac | |||
$cmd -$mode input_${confExtZone}_rule -p AH -j ACCEPT | |||
$cmd -$mode input_${confExtZone}_rule -p ESP -j ACCEPT | |||
$cmd -$mode input_${confExtZone}_rule -p UDP --dport $confPort -j ACCEPT | |||
$cmd -$mode input_${confExtZone}_rule -p UDP --dport $confNATPort -j ACCEPT | |||
} | |||
setup_sa() { | |||
local conf=$confDir/racoon.conf | |||
local remote="${2/ *}" | |||
local client="${2#* }" | |||
local locnet | |||
local remnet | |||
local p2 | |||
local data | |||
test "$2" = "$client" && unset client | |||
if [ -z "$client" ]; then | |||
config_get locnet "$1" local_net | |||
config_get remnet "$1" remote_net | |||
if [ -z "$locnet" ] || [ -z "$remnet" ]; then | |||
$log "Remote and local networks for $1 must be configured ($2)" | |||
errno=4; return 4 | |||
fi | |||
if [ "$remote" = "anonymous" ]; then | |||
echo "sainfo anonymous {" >> $conf | |||
else | |||
echo "sainfo address $locnet any address $remnet any {" >> $conf | |||
fi | |||
else | |||
echo "sainfo anonymous {" >> $conf | |||
fi | |||
config_get p2 "$1" p2_proposal | |||
if [ -z "$p2" ]; then | |||
$log "Phase2 proposal must be configured in $1 sainfo" | |||
errno=5; return 5 | |||
fi | |||
echo " remoteid $confPh1ID;" >> $conf | |||
config_get data "$p2" pfs_group | |||
test -n "$data" && echo " pfs_group $data;" >> $conf | |||
config_get data "$p2" lifetime 14400 | |||
test -n "$data" && echo " lifetime time $data sec;" >> $conf | |||
config_get data "$p2" enc_alg | |||
test -n "$data" && echo " encryption_algorithm $data;" >> $conf | |||
config_get data "$p2" auth_alg | |||
test -n "$data" && echo " authentication_algorithm $data;" >> $conf | |||
echo -e " compression_algorithm deflate;\n}" >> $conf | |||
if [ "$remote" = "anonymous" ]; then | |||
echo -e "mode_cfg {\n auth_source system;\n conf_source local;" >> $conf | |||
config_get data "$1" dns4 | |||
test -n "$data" && echo " dns4 $data;" >> $conf | |||
config_get data "$1" defdomain | |||
test -n "$data" && echo " default_domain \"$data\";" >> $conf | |||
data=${remnet%/*} | |||
let "data=${data##*.}+1" | |||
echo " network4 ${remnet%.*}.$data;" >> $conf | |||
let "data=255<<(24-${remnet#*/}+8)&255" | |||
echo " netmask4 255.255.255.$data;" >> $conf | |||
echo -e " split_network include $locnet;\n}" >> $conf | |||
elif [ -z "$client" ]; then | |||
config_list_foreach "$1" remote_exclude manage_nonesa add remote "$locnet" | |||
config_list_foreach "$1" local_exclude manage_nonesa add local "$remnet" | |||
manage_sa add "$locnet" "$remnet" $remote | |||
test $? -gt 0 -o $errno -gt 0 && return $errno | |||
manage_fw add $confIntZone $confExtZone "$remnet" | |||
fi | |||
} | |||
setup_tunnel() { | |||
local conf=$confDir/racoon.conf | |||
local peerconf=$confDir/peers.txt | |||
local data | |||
local remote | |||
local xauth | |||
config_get_bool data "$1" enabled 0 | |||
test "$data" = "0" && return 0 | |||
config_get remote "$1" remote | |||
if [ "$remote" = "anonymous" ]; then | |||
echo -e "remote anonymous {\n generate_policy on;" >> $conf | |||
else | |||
data=$(nslookup "$remote" | awk 'NR == 5 {print $3}') | |||
test -n "$data" && remote="$data" | |||
echo -e "remote \"$1\" {\n remote_address $remote;" >> $conf | |||
echo "$data" >> $peerconf | |||
fi | |||
config_get data "$1" pre_shared_key "" | |||
if [ -n "$data" ]; then | |||
if [ "$remote" != "anonymous" ]; then | |||
echo "$remote $data" >> $confDir/psk.txt | |||
else | |||
echo "* $data" >> $confDir/psk.txt | |||
fi | |||
fi | |||
let confPh1ID=$confPh1ID+1 | |||
echo " ph1id $confPh1ID;" >> $conf | |||
config_get xauth "$1" username "" | |||
config_get data "$1" certificate "" | |||
if [ -n "$data" ]; then | |||
echo -en " verify_cert on;\n my_identifier asn1dn;\n certificate_type x509 " >> $conf | |||
echo -en "\"$data.crt\" \"$data.key\";\n send_cr off;\n peers_identifier " >> $conf | |||
else | |||
config_get data "$1" my_id_type "" | |||
if [ -n "$data" ]; then | |||
echo -n " my_identifier $data" >> $conf | |||
config_get data "$1" my_id "" | |||
if [ -n "$data" ]; then | |||
echo " \"$data\";" >> $conf | |||
elif [ -n "$xauth" ]; then | |||
echo " \"$xauth\";" >> $conf | |||
else | |||
echo ";" >> $conf | |||
fi | |||
elif [ -n "$xauth" ]; then | |||
echo " my_identifier user_fqdn \"$xauth\";" >> $conf | |||
fi | |||
echo -n " peers_identifier " >> $conf | |||
fi | |||
if [ "$remote" = "anonymous" ]; then | |||
echo "user_fqdn;" >> $conf | |||
else | |||
config_get data "$1" peer_id_type "asn1dn" | |||
echo -n "$data" >> $conf | |||
config_get data "$1" peer_id "" | |||
test -n "$data" && echo -n " \"$data\"" >> $conf | |||
echo ";" >> $conf | |||
fi | |||
if [ -n "$xauth" ]; then | |||
config_get data "$1" password | |||
if [ -z "$data" ]; then | |||
$log "Password must be given in $1 tunnel" | |||
errno=7; return 7 | |||
fi | |||
echo "$xauth $data" >> $confDir/psk.txt | |||
echo " xauth_login \"$xauth\";" >> $conf | |||
echo -e " script \"p1client-up\" phase1_up;\n script \"p1client-down\" phase1_down;" >> $conf | |||
fi | |||
config_get data "$1" exchange_mode | |||
if [ -z "$data" ]; then | |||
data=main | |||
test -n "$xauth" && data="${data},aggressive" | |||
fi | |||
echo -e " exchange_mode $data;\n nat_traversal on;\n support_proxy on;" >> $conf | |||
config_get data "$1" prop_check "obey" | |||
test -n "$data" && echo " proposal_check $data;" >> $conf | |||
config_get_bool data "$1" weak_p1check 1 | |||
if [ $data -eq 0 ]; then data=off; else data=on; fi | |||
echo " weak_phase1_check $data;" >> $conf | |||
config_get_bool data "$1" verify_id 1 | |||
if [ $data -eq 0 ]; then data=off; else data=on; fi | |||
echo " verify_identifier $data;" >> $conf | |||
config_get data "$1" dpd_delay "" | |||
test -n "$data" && echo " dpd_delay $data;" >> $conf | |||
unset data | |||
test -n "$xauth" && data="on" | |||
config_get data "$1" mode_cfg "$data" | |||
test -n "$data" && echo " mode_cfg $data;" >> $conf | |||
config_get_bool data "$1" init 0 | |||
if [ $data -eq 0 ]; then data=off; else data=on; fi | |||
echo " initial_contact $data;" >> $conf | |||
config_list_foreach "$1" p1_proposal setup_p1 | |||
echo "}" >> $conf | |||
config_list_foreach "$1" sainfo setup_sa "$remote $xauth" | |||
} | |||
setup_cert() { | |||
local item | |||
local data | |||
for item in key crt ; do | |||
config_get data "$1" $item "" | |||
test -z "$data" && continue | |||
echo "$data" |\ | |||
sed 's/-\+[A-Z ]\+-\+/\n&\n/g' | sed 's/.\{50,50\}/&\n/g' | sed '/^$/d'\ | |||
> $confDir/cert/$1.$item | |||
chmod 600 $confDir/cert/$1.$item | |||
done | |||
if [ -s $confDir/cert/$1.crt ]; then | |||
data=$(openssl x509 -noout -hash -in $confDir/cert/$1.crt) | |||
ln -sf $confDir/cert/$1.crt $confDir/cert/$data.0 | |||
fi | |||
} | |||
destroy_sa() { | |||
local locnet | |||
local remnet | |||
config_get locnet "$1" local_net | |||
config_get remnet "$1" remote_net | |||
if [ -z "$locnet" ] || [ -z "$remnet" ]; then | |||
$log "Remote and local networks for $1 must be configured" | |||
errno=4; return 4 | |||
fi | |||
config_list_foreach "$1" remote_exclude manage_nonesa del remote "$locnet" | |||
config_list_foreach "$1" local_exclude manage_nonesa del local "$remnet" | |||
manage_sa del "$locnet" "$remnet" $2 | |||
manage_fw del $confIntZone $confExtZone "$remnet" | |||
} | |||
destroy_tunnel() { | |||
local data | |||
config_get_bool data "$1" enabled 0 | |||
test "$data" = "0" && return 0 | |||
config_get remote "$1" remote | |||
data=$(nslookup "$remote" | awk 'NR == 5 {print $3}') | |||
test -n "$data" && remote="$data" | |||
config_get data "$1" username "" | |||
if [ -z "$data" ]; then | |||
config_list_foreach "$1" sainfo destroy_sa $remote | |||
fi | |||
} | |||
destroy_conf() { | |||
setup_fw del | |||
} | |||
check_software() { | |||
local item | |||
for item in /usr/sbin/setkey /usr/bin/openssl /usr/sbin/ip ; do | |||
if [ ! -x $item ]; then | |||
$log "Needed program $item not found, exiting" | |||
errno=9; return 9 | |||
fi | |||
done | |||
} | |||
cleanup_conf() { | |||
config_load racoon | |||
config_foreach setup_load racoon | |||
config_foreach destroy_conf racoon | |||
config_foreach destroy_tunnel tunnel | |||
/usr/sbin/setkey -P -F | |||
/usr/sbin/setkey -F | |||
} | |||
check_dir() { | |||
local item | |||
for item in $confDir $confDir/cert ; do | |||
if [ ! -d $item ]; then | |||
mkdir -m 0700 -p $item | |||
fi | |||
done | |||
} | |||
wait4wanzone() { | |||
local item=$connWait | |||
local data | |||
data="$(get_zoneiplist $confExtZone)" | |||
while [ $item -gt 0 ]; do | |||
test -n "$data" && break | |||
sleep 2 | |||
let "item=$item-1" | |||
data="$(get_zoneiplist $confExtZone)" | |||
done | |||
test -z "$data" && return 10 | |||
} | |||
start_service() { | |||
check_software | |||
test $? -gt 0 -o $errno -gt 0 && exit $errno | |||
check_dir | |||
config_load racoon | |||
config_foreach setup_load racoon | |||
config_foreach wait4wanzone racoon | |||
if [ $? -gt 0 ] || [ $errno -gt 0 ]; then | |||
$log "No active interfaces in $confExtZone zone found, exiting" | |||
exit $errno | |||
fi | |||
config_foreach setup_conf racoon | |||
test $? -gt 0 -o $errno -gt 0 && exit $errno | |||
config_foreach setup_tunnel tunnel | |||
test $? -gt 0 -o $errno -gt 0 && exit $errno | |||
config_foreach setup_cert certificate | |||
procd_open_instance | |||
procd_set_param command /usr/sbin/racoon | |||
test -n "$confIPMode" && procd_append_param command -$confIPMode | |||
procd_append_param command -F -f $confDir/racoon.conf | |||
procd_set_param file $confDir/racoon.conf | |||
procd_close_instance | |||
if [ -x /etc/racoon/vpnctl ]; then | |||
let connWait=$connWait*2+2 | |||
( sleep $connWait; /etc/racoon/vpnctl up ) & | |||
fi | |||
} | |||
service_triggers() { | |||
local item | |||
local data | |||
procd_add_reload_trigger "racoon" "network" | |||
config_load racoon | |||
config_foreach setup_load racoon | |||
data=$(get_zoneiflist $confExtZone) | |||
if [ $? -gt 0 ] || [ $errno -gt 0 ] || [ -z "$data" ]; then | |||
$log "Can not find interfaces for $confExtZone zone" | |||
else | |||
for item in $data ; do | |||
procd_add_reload_interface_trigger $item | |||
done | |||
fi | |||
} | |||
stop_service() { | |||
cleanup_conf | |||
procd_kill racoon | |||
} | |||
trap "cleanup_conf" 1 2 3 4 5 6 7 8 9 10 | |||
# EOF /etc/init.d/racoon |
@ -1,19 +0,0 @@ | |||
#!/bin/sh | |||
# | |||
case X$1 in | |||
Xup|X1|Xstart) connMode=vpn-connect ;; | |||
Xdown|X0|Xstop) connMode=vpn-disconnect ;; | |||
*) | |||
echo "Usage: $0: up|1|start || down|0|stop" | |||
exit 1 ;; | |||
esac | |||
if [ -s /var/racoon/peers.txt ]; then | |||
(while read ipa ; do | |||
racoonctl $connMode $ipa | |||
done) < /var/racoon/peers.txt | |||
fi | |||
# EOF /usr/bin/vpnctl |
@ -1,24 +0,0 @@ | |||
--- a/src/racoon/oakley.c | |||
+++ b/src/racoon/oakley.c | |||
@@ -2424,8 +2424,21 @@ oakley_skeyid(iph1) | |||
plog(LLV_ERROR, LOCATION, iph1->remote, | |||
"couldn't find the pskey for %s.\n", | |||
saddrwop2str(iph1->remote)); | |||
+ } | |||
+ } | |||
+ if (iph1->authstr == NULL) { | |||
+ /* | |||
+ * If we could not locate a psk above try and locate | |||
+ * the default psk, ie, "*". | |||
+ */ | |||
+ iph1->authstr = privsep_getpsk("*", 1); | |||
+ if (iph1->authstr == NULL) { | |||
+ plog(LLV_ERROR, LOCATION, iph1->remote, | |||
+ "couldn't find the the default pskey either.\n"); | |||
goto end; | |||
} | |||
+ plog(LLV_NOTIFY, LOCATION, iph1->remote, | |||
+ "Using default PSK.\n"); | |||
} | |||
plog(LLV_DEBUG, LOCATION, NULL, "the psk found.\n"); | |||
/* should be secret PSK */ |
@ -1,22 +0,0 @@ | |||
--- a/src/racoon/cftoken.l | |||
+++ b/src/racoon/cftoken.l | |||
@@ -104,6 +104,8 @@ static struct include_stack { | |||
static int incstackp = 0; | |||
static int yy_first_time = 1; | |||
+ | |||
+int yywrap(void) { return 1; } | |||
%} | |||
/* common seciton */ | |||
--- a/src/setkey/token.l | |||
+++ b/src/setkey/token.l | |||
@@ -86,6 +86,8 @@ | |||
#if defined(SADB_X_EALG_AES) && ! defined(SADB_X_EALG_AESCBC) | |||
#define SADB_X_EALG_AESCBC SADB_X_EALG_AES | |||
#endif | |||
+ | |||
+int yywrap(void) { return 1; } | |||
%} | |||
/* common section */ |
@ -1,72 +0,0 @@ | |||
--- a/src/racoon/isakmp_cfg.c | |||
+++ b/src/racoon/isakmp_cfg.c | |||
@@ -38,7 +38,7 @@ | |||
#include <sys/socket.h> | |||
#include <sys/queue.h> | |||
-#include <utmpx.h> | |||
+#include <utmp.h> | |||
#if defined(__APPLE__) && defined(__MACH__) | |||
#include <util.h> | |||
#endif | |||
@@ -1664,7 +1664,8 @@ isakmp_cfg_accounting_system(port, raddr | |||
int inout; | |||
{ | |||
int error = 0; | |||
- struct utmpx ut; | |||
+ struct utmp ut; | |||
+ char term[UT_LINESIZE]; | |||
char addr[NI_MAXHOST]; | |||
if (usr == NULL || usr[0]=='\0') { | |||
@@ -1673,34 +1674,37 @@ isakmp_cfg_accounting_system(port, raddr | |||
return -1; | |||
} | |||
- memset(&ut, 0, sizeof ut); | |||
- gettimeofday((struct timeval *)&ut.ut_tv, NULL); | |||
- snprintf(ut.ut_id, sizeof ut.ut_id, TERMSPEC, port); | |||
+ sprintf(term, TERMSPEC, port); | |||
switch (inout) { | |||
case ISAKMP_CFG_LOGIN: | |||
- ut.ut_type = USER_PROCESS; | |||
- strncpy(ut.ut_user, usr, sizeof ut.ut_user); | |||
+ strncpy(ut.ut_name, usr, UT_NAMESIZE); | |||
+ ut.ut_name[UT_NAMESIZE - 1] = '\0'; | |||
+ | |||
+ strncpy(ut.ut_line, term, UT_LINESIZE); | |||
+ ut.ut_line[UT_LINESIZE - 1] = '\0'; | |||
GETNAMEINFO_NULL(raddr, addr); | |||
- strncpy(ut.ut_host, addr, sizeof ut.ut_host); | |||
+ strncpy(ut.ut_host, addr, UT_HOSTSIZE); | |||
+ ut.ut_host[UT_HOSTSIZE - 1] = '\0'; | |||
+ | |||
+ ut.ut_time = time(NULL); | |||
plog(LLV_INFO, LOCATION, NULL, | |||
"Accounting : '%s' logging on '%s' from %s.\n", | |||
- ut.ut_user, ut.ut_id, addr); | |||
- | |||
- pututxline(&ut); | |||
+ ut.ut_name, ut.ut_line, ut.ut_host); | |||
+ login(&ut); | |||
+ | |||
break; | |||
case ISAKMP_CFG_LOGOUT: | |||
- ut.ut_type = DEAD_PROCESS; | |||
plog(LLV_INFO, LOCATION, NULL, | |||
"Accounting : '%s' unlogging from '%s'.\n", | |||
- usr, ut.ut_id); | |||
- | |||
- pututxline(&ut); | |||
+ usr, term); | |||
+ logout(term); | |||
+ | |||
break; | |||
default: | |||
plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n"); |
@ -1,13 +0,0 @@ | |||
--- a/src/racoon/ipsec_doi.c | |||
+++ b/src/racoon/ipsec_doi.c | |||
@@ -3581,8 +3581,8 @@ ipsecdoi_checkid1(iph1) | |||
iph1->approval->authmethod == OAKLEY_ATTR_AUTH_METHOD_PSKEY) { | |||
if (id_b->type != IPSECDOI_ID_IPV4_ADDR | |||
&& id_b->type != IPSECDOI_ID_IPV6_ADDR) { | |||
- plog(LLV_ERROR, LOCATION, NULL, | |||
- "Expecting IP address type in main mode, " | |||
+ plog(LLV_WARNING, LOCATION, NULL, | |||
+ "Expecting IP address type in main mode (RFC2409) , " | |||
"but %s.\n", s_ipsecdoi_ident(id_b->type)); | |||
return ISAKMP_NTYPE_INVALID_ID_INFORMATION; | |||
} |
@ -1,11 +0,0 @@ | |||
--- a/src/racoon/isakmp.c | |||
+++ b/src/racoon/isakmp.c | |||
@@ -31,6 +31,8 @@ | |||
* SUCH DAMAGE. | |||
*/ | |||
+#define __packed __attribute__((__packed__)) | |||
+ | |||
#include "config.h" | |||
#include <sys/types.h> |
@ -1,50 +0,0 @@ | |||
--- a/configure.ac | |||
+++ b/configure.ac | |||
@@ -74,9 +74,10 @@ case "$host_os" in | |||
[ KERNEL_INCLUDE="/lib/modules/`uname -r`/build/include" ]) | |||
AC_CHECK_HEADER($KERNEL_INCLUDE/linux/pfkeyv2.h, , | |||
- [ AC_CHECK_HEADER(/usr/src/linux/include/linux/pfkeyv2.h, | |||
- KERNEL_INCLUDE=/usr/src/linux/include , | |||
- [ AC_MSG_ERROR([Unable to find linux-2.6 kernel headers. Aborting.]) ] ) ] ) | |||
+ [ AC_CHECK_HEADER($KERNEL_INCLUDE/uapi/linux/pfkeyv2.h, , | |||
+ [ AC_CHECK_HEADER(/usr/src/linux/include/linux/pfkeyv2.h, | |||
+ KERNEL_INCLUDE=/usr/src/linux/include , | |||
+ [ AC_MSG_ERROR([Unable to find linux-2.6 kernel headers. Aborting.]) ] ) ] ) ] ) | |||
AC_SUBST(KERNEL_INCLUDE) | |||
# We need the configure script to run with correct kernel headers. | |||
# However we don't want to point to kernel source tree in compile time, | |||
@@ -643,7 +644,14 @@ AC_EGREP_CPP(yes, | |||
#ifdef SADB_X_EXT_NAT_T_TYPE | |||
yes | |||
#endif | |||
-], [kernel_natt="yes"]) | |||
+], [kernel_natt="yes"], [ | |||
+ AC_EGREP_CPP(yes, | |||
+ [#include <uapi/linux/pfkeyv2.h> | |||
+ #ifdef SADB_X_EXT_NAT_T_TYPE | |||
+ yes | |||
+ #endif | |||
+ ], [kernel_natt="yes"]) | |||
+]) | |||
;; | |||
freebsd*|netbsd*) | |||
# NetBSD case | |||
--- a/src/include-glibc/Makefile.am | |||
+++ b/src/include-glibc/Makefile.am | |||
@@ -1,14 +1,7 @@ | |||
- | |||
-.includes: ${top_builddir}/config.status | |||
- ln -snf $(KERNEL_INCLUDE)/linux | |||
- touch .includes | |||
- | |||
-all: .includes | |||
- | |||
EXTRA_DIST = \ | |||
glibc-bugs.h \ | |||
net/pfkeyv2.h \ | |||
netinet/ipsec.h \ | |||
sys/queue.h | |||
-DISTCLEANFILES = .includes linux | |||
+DISTCLEANFILES = linux |
@ -1,12 +0,0 @@ | |||
--- a/configure.ac | |||
+++ b/configure.ac | |||
@@ -732,7 +732,8 @@ case $host in | |||
], | |||
[AC_MSG_RESULT(yes) | |||
AC_DEFINE([HAVE_POLICY_FWD], [], [Have forward policy])], | |||
- [AC_MSG_RESULT(no)]) | |||
+ [AC_MSG_RESULT(forced) | |||
+ AC_DEFINE([HAVE_POLICY_FWD], [], [Have forward policy])]) | |||
;; | |||
*) | |||
AC_MSG_RESULT(no) |
@ -1,16 +0,0 @@ | |||
Fix null dereference in racoon/gssapi.c (CVE-2015-4047) | |||
--- a/src/racoon/gssapi.c | |||
+++ b/src/racoon/gssapi.c | |||
@@ -192,6 +192,11 @@ gssapi_init(struct ph1handle *iph1) | |||
gss_name_t princ, canon_princ; | |||
OM_uint32 maj_stat, min_stat; | |||
+ if (iph1->rmconf == NULL) { | |||
+ plog(LLV_ERROR, LOCATION, NULL, "no remote config\n"); | |||
+ return -1; | |||
+ } | |||
+ | |||
gps = racoon_calloc(1, sizeof (struct gssapi_ph1_state)); | |||
if (gps == NULL) { | |||
plog(LLV_ERROR, LOCATION, NULL, "racoon_calloc failed\n"); |
@ -1,187 +0,0 @@ | |||
--- a/src/racoon/grabmyaddr.c | |||
+++ b/src/racoon/grabmyaddr.c | |||
@@ -47,7 +47,6 @@ | |||
#include <net/route.h> | |||
#include <net/if.h> | |||
#include <net/if_dl.h> | |||
-#include <sys/sysctl.h> | |||
#define USE_ROUTE | |||
#endif | |||
--- a/src/racoon/pfkey.c | |||
+++ b/src/racoon/pfkey.c | |||
@@ -59,7 +59,6 @@ | |||
#include <sys/param.h> | |||
#include <sys/socket.h> | |||
#include <sys/queue.h> | |||
-#include <sys/sysctl.h> | |||
#include <net/route.h> | |||
#include <net/pfkeyv2.h> | |||
--- a/src/setkey/setkey.c | |||
+++ b/src/setkey/setkey.c | |||
@@ -40,7 +40,6 @@ | |||
#include <sys/socket.h> | |||
#include <sys/time.h> | |||
#include <sys/stat.h> | |||
-#include <sys/sysctl.h> | |||
#include <err.h> | |||
#include <netinet/in.h> | |||
#include <net/pfkeyv2.h> | |||
--- a/src/libipsec/ipsec_strerror.h | |||
+++ b/src/libipsec/ipsec_strerror.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _IPSEC_STRERROR_H | |||
#define _IPSEC_STRERROR_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
extern int __ipsec_errcode; | |||
extern void __ipsec_set_strerror __P((const char *)); | |||
--- a/src/libipsec/libpfkey.h | |||
+++ b/src/libipsec/libpfkey.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _LIBPFKEY_H | |||
#define _LIBPFKEY_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
#ifndef KAME_LIBPFKEY_H | |||
#define KAME_LIBPFKEY_H | |||
--- a/src/racoon/backupsa.c | |||
+++ b/src/racoon/backupsa.c | |||
@@ -276,9 +276,9 @@ do { \ | |||
GETNEXTNUM(sa_args.a_keylen, strtoul); | |||
GETNEXTNUM(sa_args.flags, strtoul); | |||
GETNEXTNUM(sa_args.l_alloc, strtoul); | |||
- GETNEXTNUM(sa_args.l_bytes, strtouq); | |||
- GETNEXTNUM(sa_args.l_addtime, strtouq); | |||
- GETNEXTNUM(sa_args.l_usetime, strtouq); | |||
+ GETNEXTNUM(sa_args.l_bytes, strtoull); | |||
+ GETNEXTNUM(sa_args.l_addtime, strtoull); | |||
+ GETNEXTNUM(sa_args.l_usetime, strtoull); | |||
GETNEXTNUM(sa_args.seq, strtoul); | |||
#undef GETNEXTNUM | |||
--- a/src/racoon/cftoken.l | |||
+++ b/src/racoon/cftoken.l | |||
@@ -77,6 +77,10 @@ | |||
#include "cfparse.h" | |||
+#ifndef GLOB_TILDE | |||
+#define GLOB_TILDE 0 | |||
+#endif | |||
+ | |||
int yyerrorcount = 0; | |||
#if defined(YIPS_DEBUG) | |||
--- a/src/racoon/logger.h | |||
+++ b/src/racoon/logger.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _LOGGER_H | |||
#define _LOGGER_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
struct log { | |||
int head; | |||
int siz; | |||
--- a/src/racoon/misc.h | |||
+++ b/src/racoon/misc.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _MISC_H | |||
#define _MISC_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
#define BIT2STR(b) bit2str(b, sizeof(b)<<3) | |||
#ifdef HAVE_FUNC_MACRO | |||
--- a/src/racoon/missing/crypto/sha2/sha2.h | |||
+++ b/src/racoon/missing/crypto/sha2/sha2.h | |||
@@ -40,6 +40,8 @@ | |||
#ifndef __SHA2_H__ | |||
#define __SHA2_H__ | |||
+#include <sys/cdefs.h> | |||
+ | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
--- a/src/racoon/netdb_dnssec.h | |||
+++ b/src/racoon/netdb_dnssec.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _NETDB_DNSSEC_H | |||
#define _NETDB_DNSSEC_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
#ifndef T_CERT | |||
#define T_CERT 37 /* defined by RFC2538 section 2 */ | |||
#endif | |||
--- a/src/racoon/plog.h | |||
+++ b/src/racoon/plog.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _PLOG_H | |||
#define _PLOG_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
#ifdef HAVE_STDARG_H | |||
#include <stdarg.h> | |||
#else | |||
--- a/src/racoon/str2val.h | |||
+++ b/src/racoon/str2val.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _STR2VAL_H | |||
#define _STR2VAL_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
extern caddr_t val2str __P((const char *, size_t)); | |||
extern char *str2val __P((const char *, int, size_t *)); | |||
--- a/src/racoon/vmbuf.h | |||
+++ b/src/racoon/vmbuf.h | |||
@@ -34,6 +34,8 @@ | |||
#ifndef _VMBUF_H | |||
#define _VMBUF_H | |||
+#include <sys/cdefs.h> | |||
+ | |||
/* | |||
* bp v | |||
* v v | |||
--- a/src/setkey/extern.h | |||
+++ b/src/setkey/extern.h | |||
@@ -1,6 +1,6 @@ | |||
/* $NetBSD: extern.h,v 1.5 2009/03/06 11:45:03 tteras Exp $ */ | |||
- | |||
+#include <sys/cdefs.h> | |||
void parse_init __P((void)); | |||
int parse __P((FILE **)); | |||
--- a/src/racoon/isakmp_cfg.c | |||
+++ b/src/racoon/isakmp_cfg.c | |||
@@ -1694,8 +1694,6 @@ isakmp_cfg_accounting_system(port, raddr | |||
"Accounting : '%s' logging on '%s' from %s.\n", | |||
ut.ut_name, ut.ut_line, ut.ut_host); | |||
- login(&ut); | |||
- | |||
break; | |||
case ISAKMP_CFG_LOGOUT: | |||
@@ -1703,8 +1701,6 @@ isakmp_cfg_accounting_system(port, raddr | |||
"Accounting : '%s' unlogging from '%s'.\n", | |||
usr, term); | |||
- logout(term); | |||
- | |||
break; | |||
default: | |||
plog(LLV_ERROR, LOCATION, NULL, "Unepected inout\n"); |
@ -1,201 +0,0 @@ | |||
Description: Fix remotely exploitable DoS. http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10396 | |||
Source: vendor; https://gnats.netbsd.org/cgi-bin/query-pr-single.pl?number=51682 | |||
Bug-debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=867986 | |||
Index: ipsec-tools-0.8.2/src/racoon/isakmp_frag.c | |||
=================================================================== | |||
--- ipsec-tools-0.8.2.orig/src/racoon/isakmp_frag.c | |||
+++ ipsec-tools-0.8.2/src/racoon/isakmp_frag.c | |||
@@ -1,4 +1,4 @@ | |||
-/* $NetBSD: isakmp_frag.c,v 1.5 2009/04/22 11:24:20 tteras Exp $ */ | |||
+/* $NetBSD: isakmp_frag.c,v 1.5.36.1 2017/04/21 16:50:42 bouyer Exp $ */ | |||
/* Id: isakmp_frag.c,v 1.4 2004/11/13 17:31:36 manubsd Exp */ | |||
@@ -173,6 +173,43 @@ vendorid_frag_cap(gen) | |||
return ntohl(hp[MD5_DIGEST_LENGTH / sizeof(*hp)]); | |||
} | |||
+static int | |||
+isakmp_frag_insert(struct ph1handle *iph1, struct isakmp_frag_item *item) | |||
+{ | |||
+ struct isakmp_frag_item *pitem = NULL; | |||
+ struct isakmp_frag_item *citem = iph1->frag_chain; | |||
+ | |||
+ /* no frag yet, just insert at beginning of list */ | |||
+ if (iph1->frag_chain == NULL) { | |||
+ iph1->frag_chain = item; | |||
+ return 0; | |||
+ } | |||
+ | |||
+ do { | |||
+ /* duplicate fragment number, abort (CVE-2016-10396) */ | |||
+ if (citem->frag_num == item->frag_num) | |||
+ return -1; | |||
+ | |||
+ /* need to insert before current item */ | |||
+ if (citem->frag_num > item->frag_num) { | |||
+ if (pitem != NULL) | |||
+ pitem->frag_next = item; | |||
+ else | |||
+ /* insert at the beginning of the list */ | |||
+ iph1->frag_chain = item; | |||
+ item->frag_next = citem; | |||
+ return 0; | |||
+ } | |||
+ | |||
+ pitem = citem; | |||
+ citem = citem->frag_next; | |||
+ } while (citem != NULL); | |||
+ | |||
+ /* we reached the end of the list, insert */ | |||
+ pitem->frag_next = item; | |||
+ return 0; | |||
+} | |||
+ | |||
int | |||
isakmp_frag_extract(iph1, msg) | |||
struct ph1handle *iph1; | |||
@@ -224,39 +261,43 @@ isakmp_frag_extract(iph1, msg) | |||
item->frag_next = NULL; | |||
item->frag_packet = buf; | |||
- /* Look for the last frag while inserting the new item in the chain */ | |||
- if (item->frag_last) | |||
- last_frag = item->frag_num; | |||
+ /* Check for the last frag before inserting the new item in the chain */ | |||
+ if (item->frag_last) { | |||
+ /* if we have the last fragment, indices must match */ | |||
+ if (iph1->frag_last_index != 0 && | |||
+ item->frag_last != iph1->frag_last_index) { | |||
+ plog(LLV_ERROR, LOCATION, NULL, | |||
+ "Repeated last fragment index mismatch\n"); | |||
+ racoon_free(item); | |||
+ vfree(buf); | |||
+ return -1; | |||
+ } | |||
- if (iph1->frag_chain == NULL) { | |||
- iph1->frag_chain = item; | |||
- } else { | |||
- struct isakmp_frag_item *current; | |||
+ last_frag = iph1->frag_last_index = item->frag_num; | |||
+ } | |||
- current = iph1->frag_chain; | |||
- while (current->frag_next) { | |||
- if (current->frag_last) | |||
- last_frag = item->frag_num; | |||
- current = current->frag_next; | |||
- } | |||
- current->frag_next = item; | |||
+ /* insert fragment into chain */ | |||
+ if (isakmp_frag_insert(iph1, item) == -1) { | |||
+ plog(LLV_ERROR, LOCATION, NULL, | |||
+ "Repeated fragment index mismatch\n"); | |||
+ racoon_free(item); | |||
+ vfree(buf); | |||
+ return -1; | |||
} | |||
- /* If we saw the last frag, check if the chain is complete */ | |||
+ /* If we saw the last frag, check if the chain is complete | |||
+ * we have a sorted list now, so just walk through */ | |||
if (last_frag != 0) { | |||
+ item = iph1->frag_chain; | |||
for (i = 1; i <= last_frag; i++) { | |||
- item = iph1->frag_chain; | |||
- do { | |||
- if (item->frag_num == i) | |||
- break; | |||
- item = item->frag_next; | |||
- } while (item != NULL); | |||
- | |||
+ if (item->frag_num != i) | |||
+ break; | |||
+ item = item->frag_next; | |||
if (item == NULL) /* Not found */ | |||
break; | |||
} | |||
- if (item != NULL) /* It is complete */ | |||
+ if (i > last_frag) /* It is complete */ | |||
return 1; | |||
} | |||
@@ -291,15 +332,9 @@ isakmp_frag_reassembly(iph1) | |||
} | |||
data = buf->v; | |||
+ item = iph1->frag_chain; | |||
for (i = 1; i <= frag_count; i++) { | |||
- item = iph1->frag_chain; | |||
- do { | |||
- if (item->frag_num == i) | |||
- break; | |||
- item = item->frag_next; | |||
- } while (item != NULL); | |||
- | |||
- if (item == NULL) { | |||
+ if (item->frag_num != i) { | |||
plog(LLV_ERROR, LOCATION, NULL, | |||
"Missing fragment #%d\n", i); | |||
vfree(buf); | |||
@@ -308,6 +343,7 @@ isakmp_frag_reassembly(iph1) | |||
} | |||
memcpy(data, item->frag_packet->v, item->frag_packet->l); | |||
data += item->frag_packet->l; | |||
+ item = item->frag_next; | |||
} | |||
out: | |||
Index: ipsec-tools-0.8.2/src/racoon/isakmp_inf.c | |||
=================================================================== | |||
--- ipsec-tools-0.8.2.orig/src/racoon/isakmp_inf.c | |||
+++ ipsec-tools-0.8.2/src/racoon/isakmp_inf.c | |||
@@ -720,6 +720,7 @@ isakmp_info_send_nx(isakmp, remote, loca | |||
#endif | |||
#ifdef ENABLE_FRAG | |||
iph1->frag = 0; | |||
+ iph1->frag_last_index = 0; | |||
iph1->frag_chain = NULL; | |||
#endif | |||
Index: ipsec-tools-0.8.2/src/racoon/isakmp.c | |||
=================================================================== | |||
--- ipsec-tools-0.8.2.orig/src/racoon/isakmp.c | |||
+++ ipsec-tools-0.8.2/src/racoon/isakmp.c | |||
@@ -1071,6 +1071,7 @@ isakmp_ph1begin_i(rmconf, remote, local) | |||
iph1->frag = 1; | |||
else | |||
iph1->frag = 0; | |||
+ iph1->frag_last_index = 0; | |||
iph1->frag_chain = NULL; | |||
#endif | |||
iph1->approval = NULL; | |||
@@ -1175,6 +1176,7 @@ isakmp_ph1begin_r(msg, remote, local, et | |||
#endif | |||
#ifdef ENABLE_FRAG | |||
iph1->frag = 0; | |||
+ iph1->frag_last_index = 0; | |||
iph1->frag_chain = NULL; | |||
#endif | |||
iph1->approval = NULL; | |||
Index: ipsec-tools-0.8.2/src/racoon/handler.h | |||
=================================================================== | |||
--- ipsec-tools-0.8.2.orig/src/racoon/handler.h | |||
+++ ipsec-tools-0.8.2/src/racoon/handler.h | |||
@@ -1,4 +1,4 @@ | |||
-/* $NetBSD: handler.h,v 1.25 2010/11/17 10:40:41 tteras Exp $ */ | |||
+/* $NetBSD: handler.h,v 1.26 2017/01/24 19:23:56 christos Exp $ */ | |||
/* Id: handler.h,v 1.19 2006/02/25 08:25:12 manubsd Exp */ | |||
@@ -141,6 +141,7 @@ struct ph1handle { | |||
#endif | |||
#ifdef ENABLE_FRAG | |||
int frag; /* IKE phase 1 fragmentation */ | |||
+ int frag_last_index; | |||
struct isakmp_frag_item *frag_chain; /* Received fragments */ | |||
#endif | |||
@ -1,11 +0,0 @@ | |||
--- a/src/racoon/isakmp_xauth.c | |||
+++ b/src/racoon/isakmp_xauth.c | |||
@@ -376,6 +376,7 @@ xauth_reply(iph1, port, id, res) | |||
struct ph1handle *iph1; | |||
int port; | |||
int id; | |||
+ int res; | |||
{ | |||
struct xauth_state *xst = &iph1->mode_cfg->xauth; | |||
char *usr = xst->authdata.generic.usr; | |||
@ -1,21 +0,0 @@ | |||
--- a/src/racoon/crypto_openssl.c | |||
+++ b/src/racoon/crypto_openssl.c | |||
@@ -1087,7 +1087,7 @@ eay_strerror() | |||
int line, flags; | |||
unsigned long es; | |||
-#if OPENSSL_VERSION_NUMBER >= 0x10100000L | |||
+#if OPENSSL_VERSION_NUMBER >= 0x10000000L | |||
es = 0; /* even when allowed by OPENSSL_API_COMPAT, it is defined as 0 */ | |||
#else | |||
es = CRYPTO_thread_id(); | |||
--- a/src/racoon/openssl_compat.h | |||
+++ b/src/racoon/openssl_compat.h | |||
@@ -5,6 +5,7 @@ | |||
#if OPENSSL_VERSION_NUMBER < 0x10100000L | |||
#include <openssl/rsa.h> | |||
+#include <openssl/bn.h> | |||
#include <openssl/dh.h> | |||
#include <openssl/evp.h> | |||
#include <openssl/hmac.h> |