/orplug

Android firewall with per-app Tor circuit isolation

Primary LanguageShellISC LicenseISC

orplug, an Android firewall with per-app Tor circuit isolation

Not affiliated with the Tor Project.


    Short intro

- No GUI, please write one ;)
- Default deny pretty much everything. Combinable access policies for
  individual apps, whole Android user accounts, etc.: transparent
  torification (circuit-isolated per app), fenced off access to Socks/
  Polipo, LAN access, clearnet access
- Multi user account support
- Doesn't leak IPv6 traffic
- Clean DNS, but requires three small ROM patches
- Logs blocked DNS queries and blocked other packets
- Input firewall allows sshd by default
- Should work with enforcing SELinux
- Includes the "--state INVALID" transproxy leak fix[1]
- Tested on Android 7.1.1 (Nougat)


    Longer intro

Really no GUI, unfortunately I don't have any talent for that. There's a
simple plain text configuration format[2] though, and the command line
"orplug-reconf" script could work as a backend to a graphical app. (It
accepts stdin as well as files for configuration.)

Unconfigured processes may only communicate with localhost and the
loopback interface. You can configure an individual app, a Unix user/
group, or an Android account:

  - to be transparently torified, with circuit isolation per rule
  - to be allowed access to local TCP ports 9050/8118 for native Orbot
    support
  - to be allowed LAN access (except DNS)
  - to be allowed full clearnet access

All of the above can be combined: Transparently torify a VoIP app as
far as possible, but allow clearnet access for the remainder (UDP voice
packets). Or, for a home media streaming app: transparent torification
with LAN access.

Rules can apply to the primary Android device user account or to other
accounts.

For incoming traffic, every port is blocked to the outside by default.
But a hook loads files with raw ip(6)tables-restore rulesets, and one
such ruleset allows TCP port 22 (sshd).


    The DNS mess

Android 4.3+ mixes DNS requests of all apps together by default[3]; when
a request finally appears in Netfilter, it's unknown where it came from.
orplug takes a strict approach, so it needs a ROM patched[4] to separate
DNS queries. DNS will not work at all without these patches!

Disallowed DNS requests are blocked by sending them to a local dnsmasq
instance that only logs queries (logcat | grep dnsmasq), but doesn't
forward them. This is how I noticed that CM13 with "everything disabled"
nevertheless attempts to connect to the hosts stats.cyanogenmod.org,
account.cyngn.com, and shopvac.cyngn.com. (Via UID 1000, in this case
the Settings package.)


    Captive portals

Enable clearnet access for either UID 1000 (beware of the random stuff
apparently floating around there), or for a dedicated browser (and run
"settings put global captive_portal_detection_enabled 0" as root).


    Installation

0. Set up some independent way to check for leaks, e.g. corridor[5].
   You've been warned...
1. Copy the orplug subdirectory to /data/local/ on your Android device
   and run "chmod 755 /data/local/orplug/bin/*".
2. Add the line "su -c /data/local/orplug/bin/orplug-start" to
   /data/local/userinit.sh and run "chmod 755 userinit.sh".
3. Copy the contents of /data/local/orplug/torrc-custom-config.txt into
   the clipboard, e.g. using File Manager. This file contains directives
   for tor to open 99 different TransPort and DNSPort ports.
4. In Orbot's settings, paste the clipboard contents into "Torrc Custom
   Config", disable "Transparent Proxying", disable "Request Root
   Access", and choose "Proxy None" in "Select Apps".
5. Reboot your device.
6. Check that orplug has brought the firewall up: The output of
   "getprop orplug.up" is supposed to say "true". Log files are in
   /data/local/orplug/debug/ in case it didn't work.
7. Configure your apps by creating one ore more .conf file(s) in
   /data/local/orplug/conf/ (there's a commented user.conf.example[2]).
8. Run "su -c /data/local/orplug/bin/orplug-reconf". The output is
   supposed to say "orplug-reconf: populated". This will happen
   automatically if you reboot.
9. To help you configure a newly installed app, you can run
   "su -c /data/local/orplug/bin/orplug-newapp".


    Footnotes

1. "--state INVALID" transproxy leak fix
https://lists.torproject.org/pipermail/tor-talk/2014-March/032507.html

2. Example orplug configuration
https://raw.githubusercontent.com/rustybird/orplug/master/orplug/conf/rules/90-user.conf.example

3. Explanation of DNS in Android 4.3+
http://forum.xda-developers.com/showthread.php?t=2386584

4. Clean DNS ROM patches (in this repo)
https://raw.githubusercontent.com/rustybird/orplug/master/android-patches/system-netd.setfsids.patch
https://raw.githubusercontent.com/rustybird/orplug/master/android-patches/system-sepolicy.capabilties.patch
https://raw.githubusercontent.com/rustybird/orplug/master/android-patches/bionic.property.patch

5. corridor, a Tor traffic whitelisting gateway
https://github.com/rustybird/corridor


    Redistribution

orplug is ISC licensed, see the LICENSE file for details.