summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOdd Stranne <odd@mullvad.net>2019-05-17 13:11:38 +0200
committerOdd Stranne <odd@mullvad.net>2019-05-27 10:30:55 +0200
commit3f5517db761a40dc375eca7fadea8e6b15c03198 (patch)
treee8aabe4e92d852ea7c9136a179a27c711d253c3d
parent40692f2804da8a9cfbdea587f47e0b6de202a43f (diff)
downloadmullvadvpn-3f5517db761a40dc375eca7fadea8e6b15c03198.tar.xz
mullvadvpn-3f5517db761a40dc375eca7fadea8e6b15c03198.zip
Add 'PermitNdp' rule
-rw-r--r--windows/winfw/src/winfw/fwcontext.cpp2
-rw-r--r--windows/winfw/src/winfw/mullvadguids.cpp45
-rw-r--r--windows/winfw/src/winfw/mullvadguids.h4
-rw-r--r--windows/winfw/src/winfw/rules/permitndp.cpp89
-rw-r--r--windows/winfw/src/winfw/rules/permitndp.h18
-rw-r--r--windows/winfw/src/winfw/winfw.vcxproj2
-rw-r--r--windows/winfw/src/winfw/winfw.vcxproj.filters6
7 files changed, 166 insertions, 0 deletions
diff --git a/windows/winfw/src/winfw/fwcontext.cpp b/windows/winfw/src/winfw/fwcontext.cpp
index 395b396cde..4cff5d7166 100644
--- a/windows/winfw/src/winfw/fwcontext.cpp
+++ b/windows/winfw/src/winfw/fwcontext.cpp
@@ -5,6 +5,7 @@
#include "rules/blockall.h"
#include "rules/ifirewallrule.h"
#include "rules/permitdhcp.h"
+#include "rules/permitndp.h"
#include "rules/permitdhcpserver.h"
#include "rules/permitlan.h"
#include "rules/permitlanservice.h"
@@ -41,6 +42,7 @@ void AppendSettingsRules(FwContext::Ruleset &ruleset, const WinFwSettings &setti
if (settings.permitDhcp)
{
ruleset.emplace_back(std::make_unique<rules::PermitDhcp>());
+ ruleset.emplace_back(std::make_unique<rules::PermitNdp>());
}
if (settings.permitLan)
diff --git a/windows/winfw/src/winfw/mullvadguids.cpp b/windows/winfw/src/winfw/mullvadguids.cpp
index 5cc5d5b631..29e38a3b49 100644
--- a/windows/winfw/src/winfw/mullvadguids.cpp
+++ b/windows/winfw/src/winfw/mullvadguids.cpp
@@ -56,6 +56,9 @@ DetailedWfpObjectRegistry MullvadGuids::BuildDetailedRegistry()
registry.insert(std::make_pair(WfpObjectType::Filter, FilterRestrictDns_Outbound_Tunnel_Ipv6()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitVpnTunnelService_Ipv4()));
registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitVpnTunnelService_Ipv6()));
+ registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitNdp_Outbound_Router_Solicitation()));
+ registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitNdp_Inbound_Router_Advertisement()));
+ registry.insert(std::make_pair(WfpObjectType::Filter, FilterPermitNdp_Inbound_Redirect()));
return registry;
}
@@ -522,3 +525,45 @@ const GUID &MullvadGuids::FilterPermitVpnTunnelService_Ipv6()
return g;
}
+
+//static
+const GUID &MullvadGuids::FilterPermitNdp_Outbound_Router_Solicitation()
+{
+ static const GUID g =
+ {
+ 0xbc5a85e4,
+ 0x5319,
+ 0x4224,
+ { 0x8a, 0x27, 0x53, 0xeb, 0x61, 0xef, 0x3b, 0x1 }
+ };
+
+ return g;
+}
+
+//static
+const GUID &MullvadGuids::FilterPermitNdp_Inbound_Router_Advertisement()
+{
+ static const GUID g =
+ {
+ 0x4d996f1d,
+ 0x4915,
+ 0x4a6a,
+ { 0xbd, 0xf5, 0xb5, 0x1a, 0x2d, 0xbc, 0xb8, 0xe9 }
+ };
+
+ return g;
+}
+
+//static
+const GUID &MullvadGuids::FilterPermitNdp_Inbound_Redirect()
+{
+ static const GUID g =
+ {
+ 0xcec23a8,
+ 0x4fdd,
+ 0x4a96,
+ { 0xae, 0xba, 0x33, 0xd2, 0xa7, 0xf, 0x85, 0x22 }
+ };
+
+ return g;
+}
diff --git a/windows/winfw/src/winfw/mullvadguids.h b/windows/winfw/src/winfw/mullvadguids.h
index ca1f926e9b..c2a8c8537e 100644
--- a/windows/winfw/src/winfw/mullvadguids.h
+++ b/windows/winfw/src/winfw/mullvadguids.h
@@ -63,4 +63,8 @@ public:
static const GUID &FilterPermitVpnTunnelService_Ipv4();
static const GUID &FilterPermitVpnTunnelService_Ipv6();
+
+ static const GUID &FilterPermitNdp_Outbound_Router_Solicitation();
+ static const GUID &FilterPermitNdp_Inbound_Router_Advertisement();
+ static const GUID &FilterPermitNdp_Inbound_Redirect();
};
diff --git a/windows/winfw/src/winfw/rules/permitndp.cpp b/windows/winfw/src/winfw/rules/permitndp.cpp
new file mode 100644
index 0000000000..2aca5d0d1b
--- /dev/null
+++ b/windows/winfw/src/winfw/rules/permitndp.cpp
@@ -0,0 +1,89 @@
+#include "stdafx.h"
+#include "permitndp.h"
+#include "winfw/mullvadguids.h"
+#include "libwfp/filterbuilder.h"
+#include "libwfp/conditionbuilder.h"
+#include "libwfp/ipaddress.h"
+#include "libwfp/ipnetwork.h"
+#include "libwfp/conditions/conditionprotocol.h"
+#include "libwfp/conditions/conditionicmp.h"
+#include "libwfp/conditions/conditionip.h"
+
+using namespace wfp::conditions;
+
+namespace rules
+{
+
+bool PermitNdp::apply(IObjectInstaller &objectInstaller)
+{
+ const wfp::IpNetwork linkLocal(wfp::IpAddress::Literal6({ 0xFE80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }), 10);
+ const wfp::IpAddress::Literal6 linkLocalRouterMulticast{ 0xFF02, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2 };
+
+ wfp::FilterBuilder filterBuilder;
+
+ //
+ // #1 permit outbound router solicitation
+ //
+
+ filterBuilder
+ .key(MullvadGuids::FilterPermitNdp_Outbound_Router_Solicitation())
+ .name(L"Permit outbound NDP router solicitation")
+ .layer(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
+
+ {
+ wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_CONNECT_V6);
+
+ conditionBuilder.add_condition(ConditionProtocol::IcmpV6());
+ conditionBuilder.add_condition(ConditionIcmp::Type(133));
+ conditionBuilder.add_condition(ConditionIcmp::Code(0));
+ conditionBuilder.add_condition(ConditionIp::Remote(linkLocalRouterMulticast));
+
+ if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
+ {
+ return false;
+ }
+ }
+
+ //
+ // #2 permit inbound router advertisement
+ //
+
+ filterBuilder
+ .key(MullvadGuids::FilterPermitNdp_Inbound_Router_Advertisement())
+ .name(L"Permit inbound NDP router advertisement")
+ .layer(FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6);
+
+ {
+ wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6);
+
+ conditionBuilder.add_condition(ConditionProtocol::IcmpV6());
+ conditionBuilder.add_condition(ConditionIcmp::Type(134));
+ conditionBuilder.add_condition(ConditionIcmp::Code(0));
+ conditionBuilder.add_condition(ConditionIp::Remote(linkLocal));
+
+ if (!objectInstaller.addFilter(filterBuilder, conditionBuilder))
+ {
+ return false;
+ }
+ }
+
+ //
+ // #3 permit inbound redirect message
+ //
+
+ filterBuilder
+ .key(MullvadGuids::FilterPermitNdp_Inbound_Redirect())
+ .name(L"Permit inbound NDP redirect")
+ .layer(FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6);
+
+ wfp::ConditionBuilder conditionBuilder(FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V6);
+
+ conditionBuilder.add_condition(ConditionProtocol::IcmpV6());
+ conditionBuilder.add_condition(ConditionIcmp::Type(137));
+ conditionBuilder.add_condition(ConditionIcmp::Code(0));
+ conditionBuilder.add_condition(ConditionIp::Remote(linkLocal));
+
+ return objectInstaller.addFilter(filterBuilder, conditionBuilder);
+}
+
+}
diff --git a/windows/winfw/src/winfw/rules/permitndp.h b/windows/winfw/src/winfw/rules/permitndp.h
new file mode 100644
index 0000000000..ebd53b62c2
--- /dev/null
+++ b/windows/winfw/src/winfw/rules/permitndp.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include "ifirewallrule.h"
+
+namespace rules
+{
+
+class PermitNdp : public IFirewallRule
+{
+public:
+
+ PermitNdp() = default;
+ ~PermitNdp() = default;
+
+ bool apply(IObjectInstaller &objectInstaller) override;
+};
+
+}
diff --git a/windows/winfw/src/winfw/winfw.vcxproj b/windows/winfw/src/winfw/winfw.vcxproj
index cbd14ac9aa..9ab1963930 100644
--- a/windows/winfw/src/winfw/winfw.vcxproj
+++ b/windows/winfw/src/winfw/winfw.vcxproj
@@ -29,6 +29,7 @@
<ClCompile Include="rules\permitlan.cpp" />
<ClCompile Include="rules\permitlanservice.cpp" />
<ClCompile Include="rules\permitloopback.cpp" />
+ <ClCompile Include="rules\permitndp.cpp" />
<ClCompile Include="rules\permitvpntunnelservice.cpp" />
<ClCompile Include="rules\permitvpnrelay.cpp" />
<ClCompile Include="rules\permitvpntunnel.cpp" />
@@ -51,6 +52,7 @@
<ClInclude Include="mullvadobjects.h" />
<ClInclude Include="objectpurger.h" />
<ClInclude Include="rules\permitdhcpserver.h" />
+ <ClInclude Include="rules\permitndp.h" />
<ClInclude Include="wfpobjecttype.h" />
<ClInclude Include="rules\blockall.h" />
<ClInclude Include="rules\ifirewallrule.h" />
diff --git a/windows/winfw/src/winfw/winfw.vcxproj.filters b/windows/winfw/src/winfw/winfw.vcxproj.filters
index c8bbb5beda..0319b0214a 100644
--- a/windows/winfw/src/winfw/winfw.vcxproj.filters
+++ b/windows/winfw/src/winfw/winfw.vcxproj.filters
@@ -40,6 +40,9 @@
<ClCompile Include="rules\permitdhcpserver.cpp">
<Filter>rules</Filter>
</ClCompile>
+ <ClCompile Include="rules\permitndp.cpp">
+ <Filter>rules</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h" />
@@ -87,6 +90,9 @@
<ClInclude Include="rules\permitdhcpserver.h">
<Filter>rules</Filter>
</ClInclude>
+ <ClInclude Include="rules\permitndp.h">
+ <Filter>rules</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="rules">