they still need to be proofed to make sure they got fully converted.main
@@ -0,0 +1,124 @@ | |||
--- | |||
title: Installing and running NetBSD and OpenBSD under bhyve | |||
description: > | |||
Installing and running NetBSD and OpenBSD under bhyve | |||
created: !!timestamp '2015-07-28' | |||
time: 8:37 PM | |||
tags: | |||
- NetBSD | |||
- OpenBSD | |||
- byhve | |||
- FreeBSD | |||
--- | |||
These instructions assume that you have downloaded the install ISO from | |||
the respective sources. These were doing with specific versions, and | |||
there may be minor changes with older and newer versions. | |||
These instructions could possibly be more simple, such as not using | |||
separate device maps for `grub-bhyve`. These were testing on a month | |||
old HEAD. | |||
There are other guides that cover most of this, and probably in more | |||
detail. The issue that I had was the exact commands to grub to load | |||
kernels was not well documented. Both of the images boot and are able | |||
to get DHCP leases and pass basic traffic. | |||
Hope this helps others! | |||
## NetBSD | |||
1. Install `grub2-bhyve`: | |||
``` | |||
pkg install grub2-bhyve | |||
``` | |||
2. Create a file called `instdev.map` containing: | |||
``` | |||
(cd0) NetBSD-6.1.5-amd64.iso | |||
(hd1) netbsd.img | |||
``` | |||
3. Create the file `netbsd.img` with the correct size: | |||
``` | |||
truncate -s 3g netbsd.img | |||
``` | |||
4. Run the following commands (or put into a script file) under `sh`: | |||
``` | |||
MEM=512M | |||
VM=nbsd615 | |||
bhyvectl --destroy --vm=$VM | |||
grub-bhyve -r cd0 -M $MEM -m instdev.map $VM <<EOF | |||
knetbsd -h -r cd0a | |||
(cd0)/netbsdboot | |||
EOF | |||
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc \ | |||
-s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,./netbsd.img \ | |||
-s 4:0,ahci-cd,./NetBSD-6.1.5-amd64.iso \ | |||
-l com1,stdio -c 2 -m $MEM $VM | |||
``` | |||
5. This will run the installer, complete the installation. | |||
6. Create a file called `dev.map` containing: | |||
``` | |||
(hd1) netbsd.img | |||
``` | |||
7. Now in the future, to run NetBSD from the image, run the following commands: | |||
``` | |||
MEM=512M | |||
VM=nbsd615 | |||
bhyvectl --destroy --vm=$VM | |||
grub-bhyve -r cd0 -M $MEM -m dev.map $VM <<EOF | |||
knetbsd -h -r ld0a | |||
(hd1,msdos1)/netbsdboot | |||
EOF | |||
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc \ | |||
-s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,./netbsd.img \ | |||
-l com1,stdio -c 2 -m $MEM $VM | |||
``` | |||
8. Profit! | |||
## OpenBSD | |||
1. Install `grub2-bhyve`: | |||
``` | |||
pkg install grub2-bhyve | |||
``` | |||
2. Create a file called `instdev.map` containing: | |||
``` | |||
(cd0) install57.iso | |||
(hd1) openbsd.img | |||
``` | |||
3. Create the file `openbsd.img` with the correct size: | |||
``` | |||
truncate -s 3g openbsd.img | |||
``` | |||
4. Run the following commands (or put into a script file) under `sh`: | |||
``` | |||
MEM=512M | |||
VM=obsd57 | |||
bhyvectl --destroy --vm=$VM | |||
grub-bhyve -r cd0 -M $MEM -m instdev.map $VM <<EOF | |||
kopenbsd -h com0 | |||
(cd0)/5.7/amd64/bsd.rdboot | |||
EOF | |||
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc \ | |||
-s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,./openbsd.img \ | |||
-s 4:0,ahci-cd,./install57.iso \ | |||
-l com1,stdio -c 2 -m $MEM $VM | |||
5. This will run the installer, complete the installation. | |||
6. Create a file called `dev.map` containing: | |||
``` | |||
(hd1) netbsd.img | |||
``` | |||
7. Now in the future, to run OpenBSD from the image, run the following commands: | |||
``` | |||
MEM=512M | |||
VM=obsd57 | |||
bhyvectl --destroy --vm=$VM | |||
grub-bhyve -r hd1 -M $MEM -m dev.map $VM <<EOF | |||
kopenbsd -h com0 -r sd0a | |||
(hd1,openbsd1)/bsdboot | |||
EOF | |||
bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc \ | |||
-s 2:0,virtio-net,tap3 -s 3:0,virtio-blk,./openbsd.img \ | |||
-s 4:0,ahci-cd,./install57.iso \ | |||
-l com1,stdio -c 2 -m $MEM $VM | |||
8. Profit! |
@@ -0,0 +1,100 @@ | |||
--- | |||
title: Adventures in Autobahn/WAMP Security | |||
description: > | |||
Adventures in Autobahn/WAMP Security | |||
created: !!timestamp '2017-09-17' | |||
time: 12:21 PM | |||
tags: | |||
- web | |||
- WAMP | |||
- security | |||
--- | |||
## Or how security continues to suck because: It's Hard and Someone Else's Problem™ | |||
For a personal project, I've decided to use WAMP to move some events and | |||
messages around between different components. I decided on the AutoBahn | |||
libraries and Crossbar.io as the router. I was already somewhat familiar | |||
w/ AutoBahn from previous work, and the Crossbar.io router seems to just | |||
work. As a security person, I decided to evaluate how to make things as | |||
secure as possible. | |||
First off, | |||
[my projects must be both authenticated and encrypted](https://twitter.com/encthenet/status/881596129573347328). | |||
WAMP does not appear to have it's own encryption layer, but it does have | |||
it's own authentication layer. You really don't want to have to trust | |||
two different authentication layers<label for="sn-encauth" | |||
class="margin-toggle sidenote-number"></label><input type="checkbox" | |||
id="sn-encauth" class="margin-toggle"/><span class="sidenote" | |||
id="sn-encauth">The encryption layer must be authenticated, otherwise | |||
any attacker could MiTM the connection. Most uses of TLS make use of | |||
the CA system for authentication (which has serious issues in trust), | |||
and most web apps add their own authentication layer on top of it (not | |||
using Basic Auth, or other scheme). The issues w/ this is that if there | |||
is no binding between the two layers, the lower layer (application | |||
layer) cannot be sure that the upper layer has not been compromised.</span>, | |||
so being able to use | |||
[TLS Channel Bindings](https://tools.ietf.org/html/rfc5929) would be an | |||
improvement. This would ensure that a strong authentication method in | |||
WAMP would ensure that the channel is properly encrypted. I | |||
[received confirmation](https://twitter.com/crossbario/status/904690145907142656) | |||
from the Crossbar.io team that it was present. | |||
Autobahn and Crossbar.io supports a number of | |||
[different authentication schemes](https://crossbar.io/docs/Authentication/). | |||
As I plan on putting this behind a reverse proxy (which I realize will | |||
have it's own issues w/ channel binding), I wanted the strongest security | |||
binding between my client and the server (and I'm a glutton for punishment | |||
for using unproven tech). The only one that satisfies this requirement | |||
is WAMP-Cryptosign. | |||
After I got basic functionality working to make sure things would be | |||
workable w/ this framework, I decided to start working on the | |||
authentication piece. First problem I ran into was that the AutoBahn|JS | |||
library does not support TLS channel binding. There is a good read the | |||
library doesn't support it, and it's for a very bad reason. There is | |||
no support in the browser [WebSocket API](https://www.w3.org/TR/websockets/) | |||
to query the channel binding information necessary. The fact that | |||
WebSockets was standardized after Channel bindings were demonstrates that | |||
the people involved in standardizing the web do not take security | |||
seriously. As usual, they assume that security is not their problem and | |||
leaves it up to someone else to solve (or at another layer). | |||
Disappointed that I wouldn't be able to use channel bindings w/ the web | |||
client for this project (I still had the crappy CA authentication of TLS, | |||
so not all was lost), I moved forward w/ CryptoSign. As has been | |||
demonstrated many times, the only way to get security baked in, is to | |||
make it as easy as possible to use. I've been long familiar w/ | |||
[Crypto Box](https://nacl.cr.yp.to/box.html) by djb (and used by the | |||
Autobahn libraries), and also the [noise protocol](http://noiseprotocol.org/) | |||
(which my friend Trevor created). Both of these have goals of making | |||
it simple to let developers include security in their projects and not | |||
mess it up, resulting in a broken system. As currently implemented, | |||
Autobahn's CryptoSign is most definitely not easy to use. | |||
Though the documentation is decent, some examples are not present | |||
(`client_ssh_key.py` for example from | |||
[WAMP-cryptosign Static Authentication](https://github.com/crossbario/crossbar-examples/tree/master/authentication/cryptosign/static)). | |||
The | |||
[ApplicationRunner](http://autobahn.readthedocs.io/en/latest/wamp/programming.html#running-components) | |||
helper class does not document how to make use of authentication. Though | |||
the static authentication page has examples, they make you write quite | |||
a bit of boiler plate. | |||
Then even once you do that, you find out that the code doesn't even work | |||
on Python 2.7 and have to | |||
[fix it](https://github.com/crossbario/autobahn-python/pull/901) for | |||
them. Hopefully the pull request (PR) will not be ignored because of the | |||
failing CI tests, because the current CI tests are problems with their | |||
CI environment, and not the PR. For CI checks like this, it should only | |||
ding your PR on checks that are newly failing, and ignore any checks that | |||
were previously failing. This isn't the first project that their CI | |||
environment was broken. | |||
Even w/ the fixes in place, there is no documented method of extracting | |||
a public key from a generated ssh key. I will be adding a method to | |||
print this out. | |||
If I (who knows cryptography decently) have to fix and spend hours making | |||
this work, it's no wonder than everyone things that strong cryptography | |||
is hard. It is hard, but it shouldn't be. |
@@ -0,0 +1,3 @@ | |||
extends: blog.j2 | |||
default_block: post | |||
listable: true |
@@ -0,0 +1,80 @@ | |||
--- | |||
title: Unusable Insecurity | |||
description: > | |||
Unusable Insecurity | |||
created: !!timestamp '2018-03-16' | |||
time: 1:40 PM | |||
tags: | |||
- security | |||
--- | |||
Many people claim that security is hard, and in many cases it is hard, | |||
but that isn't an excuse to make it harder than it needs to be. There | |||
are many layers to security, but adding extra layers, or making security | |||
controls inscrutable is a great way to ensure insecurity. Security needs | |||
to be simple and straightforward to configure, and easy to understand. | |||
There may be knobs for advanced users, but defaults need to be simple and correct. | |||
I recently looked at using S3 as a shared store for some data. I was | |||
using the account New Context created for me that had limited AWS | |||
permissions. Creating the S3 bucket was simple enough, and making it | |||
not-public was too, but then I wanted to create a user/API key that only | |||
had access to the S3 bucket. Per Amazon | |||
[IAM Best Practices](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html), | |||
you should not share your account, but create new users for access. It | |||
turns out that I did not have the CreateUser permission. I involved a | |||
co-worker who did have permissions to create the user. Adding another | |||
person to the task makes things more complex through communication and | |||
their availability to work on it instead of their normal work. | |||
As part of creating a user, you have to figure out what the Policy that | |||
you need to assign to the user. Amazon provides some | |||
[Bucket Policy Examples](https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html), | |||
but none of them is a simple policy on granting read and write permissions | |||
to the bucket. There is an | |||
[Amazon Policy Generator](https://awspolicygen.s3.amazonaws.com/policygen.html) | |||
for helping you to create the policies, but it doesn't allow you to | |||
select buckets from your account (to simplify ARN [Amazon Resource Name] | |||
selection), and there are almost 70 actions provided in the selector. | |||
After some brief reading, I settled on a simple policy that I thought | |||
would allow the new user proper access: 4 permissions: PutObjects, | |||
GetObjects, ListObjects and RestoreObjects. | |||
My co-worker created the user and applied the policy, but then I got an | |||
error handle code. Amazon does not provide an interface for turning on | |||
logging and/or querying why a request failed. Despite the error handle, | |||
I had ZERO insight into why the request failed. I could have involved | |||
AWS support, but now that would add yet another party in attempting to | |||
properly configure S3. | |||
At this stage, I decided to give up, as I had already spent a few hours | |||
of my time, some of my co-worker's time, and a couple weeks due to | |||
various delays due to availability and other work. In this case, storing | |||
the data in S3 was more of a nicety, and I decided that checking the | |||
data into a private git repo was adequate compared to the complexities | |||
involved in configuring S3. git was a tried and tested way to store data | |||
and restrict access while S3 for this usage was not, and hard to | |||
configure. | |||
After I wrote this blog post, a coworker linked me to the blog post titled | |||
[Writing IAM Policies: How to Grant Access to an Amazon S3 Bucket](https://aws.amazon.com/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/). | |||
It is concerning that this blog post has not been integrated, nor linked | |||
to from any of the IAM or S3 documentation. This is a valuable resource | |||
that should not be hidden. | |||
I'm clearly not the only one that has had issues configuring S3 buckets. | |||
The end of 2017 has shown a large number of organizations fail to | |||
properly secure their S3 buckets, leaving many terabytes of data open | |||
for public download. It is unacceptable that such a service is so | |||
difficult to configure. The site https://s3stupidity.com/ lists the | |||
large number of breaches, many of which are by large companies who | |||
should have the technical chops (and $$) to properly configure it. | |||
Security controls need to be simple and clear. Their descriptions need | |||
to be accurate and concise in what they do, and how they do it. Amazon | |||
does have a number of good resources, but they do not have a | |||
comprehensive guide for what each permission does. You cannot blame | |||
users for security failures when you make it next to impossible to | |||
configure properly. | |||
Edited to remove a couple extra words. |
@@ -0,0 +1,163 @@ | |||
--- | |||
title: Making FreeBSD magnet links | |||
description: > | |||
Making FreeBSD magnet links | |||
created: !!timestamp '2018-07-03' | |||
time: 4:49 PM | |||
tags: | |||
- FreeBSD | |||
- magnet | |||
--- | |||
For the last few years, I've been producing torrents and publishing | |||
magnet links, but there is some special work that I do to make these. | |||
The first few releases, I inserted a bogus tracker into the torrent, | |||
because despite there being plenty of tools out there for producing | |||
trackerless (DHT) torrents, they were all GUI and I never found any that | |||
were command line based. The other was there was/is no tool for | |||
extracting the info hash and building the magnet link. There may be | |||
tools now, but I couldn't find any when I started 3 years ago. | |||
The following steps are based upon the recent release of FreeBSD 11.2-R, | |||
adjust as necessary. | |||
1. Fetch FreeBSD into a directory (I create a per release directory). There | |||
are a few directories that you have mirror, I use wget for this. The | |||
mirroring feature for wget isn't great. After each command I have to | |||
remove the `CHECKSUM.SHA256`, `CHECKSUM.SHA512` and `index.html*` files. | |||
``` | |||
$ wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/ISO-IMAGES/11.2/ | |||
$ wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/aarch64/Latest/ | |||
$ wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/amd64/Latest/ | |||
$ wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/i386/Latest/ | |||
``` | |||
2. Fetch the signature files: | |||
``` | |||
$ wget https://www.freebsd.org/releases/11.2R/CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-{amd64,i386,powerpc,powerpc-powerpc64,sparc64,arm64-aarch64}.asc | |||
$ wget https://www.freebsd.org/releases/11.2R/CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-{amd64,i386,arm64-aarch64}-vm.asc | |||
$ wget https://www.freebsd.org/releases/11.2R/CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-arm-armv6-{BANANAPI,BEAGLEBONE,CUBIEBOARD,CUBIEBOARD2,CUBBOX-HUMMINGBOARD,GUMSTIX,PANDABOARD,RPI-B,RPI2,WANDBOARD}.asc | |||
``` | |||
3. Verify the GPG key that signed the above files. This is usually Glen | |||
Barber's key, but not always. I have met and verified his fingerprint | |||
in person, If you have verified someone's key who has signed Glen's | |||
key, that is another good way. | |||
4. Verify the checksum files: | |||
``` | |||
$ for i in *.asc; do gpg --verify $i; done | |||
You should see a bunch of lines like: | |||
Warning: using insecure memory! | |||
gpg: Signature made Fri Jun 22 09:33:50 2018 PDT | |||
gpg: using RSA key 0x031458A5478FE293 | |||
gpg: Good signature from "Glen Barber <gjb@FreeBSD.org>" [full] | |||
gpg: aka "Glen Barber <glen.j.barber@gmail.com>" [full] | |||
gpg: aka "Glen Barber <gjb@glenbarber.us>" [full] | |||
gpg: aka "Glen Barber <gjb@keybase.io>" [unknown] | |||
gpg: WARNING: not a detached signature; file 'CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-amd64-vm' was NOT verified! | |||
``` | |||
The last line can be ignored. The non-`.asc` files were d/l'd and will | |||
not be used. Make sure that all of the files report Good signature. | |||
5. In the past I have used BitTornado for other things, so I ended up | |||
using it as the basis to make the tool for creating trackerless torrent | |||
files. The modifications were simple. It appears that the original | |||
BitTornado CVS tree is off-line (anyways, it was served insecurely), | |||
but it looks like | |||
[effigies/BitTornado](https://github.com/effigies/BitTornado) is | |||
similar enough that it could be modified and used. I copied | |||
`btmakemetafile.py` to `btmaketrackerless.py` and applied the following | |||
patch: | |||
``` | |||
$ diff -u btmakemetafile.py btmaketrackerless.py | |||
--- btmakemetafile.py 2004-05-24 12:54:52.000000000 -0700 | |||
+++ btmaketrackerless.py 2016-10-10 17:13:32.742081000 -0700 | |||
@@ -23,9 +23,9 @@ | |||
def prog(amount): | |||
print '%.1f%% complete\r' % (amount * 100), | |||
-if len(argv) < 3: | |||
+if len(argv) < 2: | |||
a,b = split(argv[0]) | |||
- print 'Usage: ' + b + ' <trackerurl> <file> [file...] [params...]' | |||
+ print 'Usage: ' + b + ' <file> [file...] [params...]' | |||
print formatDefinitions(defaults, 80) | |||
print_announcelist_details() | |||
@@ -33,9 +33,9 @@ | |||
exit(2) | |||
try: | |||
- config, args = parseargs(argv[1:], defaults, 2, None) | |||
- for file in args[1:]: | |||
- make_meta_file(file, args[0], config, progress = prog) | |||
+ config, args = parseargs(argv[1:], defaults, 1, None) | |||
+ for file in args[0:]: | |||
+ make_meta_file(file, None, config, progress = prog) | |||
except ValueError, e: | |||
print 'error: ' + str(e) | |||
print 'run with no args for parameter explanations' | |||
``` | |||
If you notice, the only thing that is done is to drop the first argument, | |||
and instead of passing it into `make_meta_file`, a `None` is passed | |||
instead. This will simply not add trackers to the torrent file. | |||
6. I then run the following script to verify the downloaded files, and | |||
generate the torrent files: | |||
``` | |||
$ cat cmp.sh | |||
#!/bin/sh - | |||
# wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/ISO-IMAGES/11.2/ | |||
# wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/aarch64/Latest/ | |||
# wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/amd64/Latest/ | |||
# wget -c -r -l 1 -nd --limit-rate=800k https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/i386/Latest/ | |||
# wget https://www.freebsd.org/releases/11.2R/CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-{amd64,i386,powerpc,powerpc-powerpc64,sparc64,arm64-aarch64}.asc | |||
# wget https://www.freebsd.org/releases/11.2R/CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-{amd64,i386,arm64-aarch64}-vm.asc | |||
# wget https://www.freebsd.org/releases/11.2R/CHECKSUM.SHA512-FreeBSD-11.2-RELEASE-arm-armv6-{BANANAPI,BEAGLEBONE,CUBIEBOARD,CUBIEBOARD2,CUBBOX-HUMMINGBOARD,GUMSTIX,PANDABOARD,RPI-B,RPI2,WANDBOARD}.asc | |||
grep -h '^SHA512' CHECK*.asc | sed -e 's/SHA512 (\(.*\)) = \(.*\)/\2 \1/' | sort -k 2 > sha512.from.asc | |||
while read hash fname; do | |||
if [ -e "$fname" ]; then | |||
sigfile=`grep -l -- "$fname" *.asc | head -n 1` | |||
echo checking "$fname", sig in: "$sigfile" | |||
#res=`sha512 -q "$fname"` | |||
res=`shasum -a 512 "$fname" | awk '{ print $1 }'` | |||
echo "File is: $res" | |||
if [ x"$res" != x"$hash" ]; then | |||
echo missmatch! "$fname" | |||
exit 1 | |||
fi | |||
if ! [ -e "$fname".torrent ]; then | |||
btmaketrackerless.py "$fname" | |||
fi | |||
else | |||
echo missing "$fname" | |||
exit 1 | |||
fi | |||
done < sha512.from.asc | |||
``` | |||
7. Once all the torrents have been generated, I then make the magnet | |||
links: | |||
``` | |||
$ cat btmakemagnet.sh | |||
#!/bin/sh - | |||
# metainfo file.: FreeBSD-10.3-RELEASE-sparc64-bootonly.iso.torrent | |||
# info hash.....: 06091dabce1296d11d1758ffd071e7109a92934f | |||
# file name.....: FreeBSD-10.3-RELEASE-sparc64-bootonly.iso | |||
# file size.....: 203161600 (775 * 262144 + 0) | |||
# announce url..: udp://tracker.openbittorrent.com:80 | |||
# btshowmetainfo 20030621 - decode BitTorrent metainfo files | |||
for i in *.torrent; do | |||
btshowmetainfo.py "$i" | awk ' | |||
$0 ~ "^info hash" { info = $3 } | |||
$0 ~ "^file name" { name = $3 } | |||
END { | |||
print "magnet:?xt=urn:btih:" info "&dn=" name | |||
}' | |||
done | |||
``` | |||
8. I then create the magnet links file, and update the | |||
[Torrents](https://wiki.freebsd.org/Torrents) wiki page. | |||
Sorry about the code formatting. I don't know how to make it look better | |||
in blogger. |
@@ -0,0 +1,118 @@ | |||
--- | |||
title: "Crash Dumps: Do I submit them?" | |||
description: > | |||
"Crash Dumps: Do I submit them?" | |||
created: !!timestamp '2018-10-23' | |||
time: 3:54 PM | |||
tags: | |||
- security | |||
--- | |||
TL;DR: No, do not submit your crash dumps. Consumers: No company has | |||
sane crash dump policies to ensure your privacy and PII is protected, | |||
minimized and secured. Companies: You need to ensure that crash dumps | |||
are handled in a secure manner and that crash dumps are just that: a | |||
crash dump. Anything not directly related to a crash dump should be | |||
excluded. Usage statistics and the like do not belong in crash reports. | |||
## Why Not Send Dumps? | |||
There is a long history of companies failing to minimize the data and | |||
to protect it. Microsoft for years sent crash dumps over the internet | |||
in the clear | |||
([WER & Privacy conerns](https://en.wikipedia.org/wiki/Windows_Error_Reporting#Privacy_concerns_and_use_by_the_NSA)). | |||
This allowed the NSA to harvest them, and develop 0-days for issues that | |||
MS failed to fix. Google's Chrome would send a screencap of the entire | |||
Desktop along with it's crash dumps | |||
([link](https://twitter.com/vmjulix/status/857482886097715200)). It | |||
previously would only send the window, but now sends the entire screen. | |||
Though they provide a preview, there is no way to see exactly what | |||
information will be sent. | |||
I do not relish in advising people to not submit crash dumps as this | |||
will impact developers ability to fix bugs. But as with all aspects of | |||
security, companies continue to demonstrate that they are not willing | |||
to do the work that is necessary to protect user's data and their | |||
privacy. | |||
## Communication | |||
You need to communicate to your users how crash dumps are handled. Just | |||
saying, trust us, does not inspire confidence, as there are a large | |||
number of cases of data breaches where the company has said exactly that | |||
leading up to leaks. The policy is the first step to demonstrating that | |||
you have thought about user's concerns and decided how you will handle | |||
their personal and sensitive data. | |||
The policy also helps shape how employees will treat the data too. By | |||
having the policy, it is a reiteration to the employees that user data | |||
isn't simply chaff, but that it needs to be protected and handled with | |||
care. | |||
Just saying that it's protected by a privacy policy isn't enough. For | |||
example, Google Chrome's Report an Issue says that the information is | |||
protected by their privacy policy, but if you read the Chrome browser | |||
Privacy Policy, there is nothing in there that says how the data is | |||
handled. That it is handled like the rest of the data collected does | |||
not inspire confidence that the possibly confidential data that may be | |||
included will be handled with greater care. | |||
## How to handle dumps | |||
The first step is to ensure that what is collected in the dump has | |||
minimum information needed to debug issues. Code paths (back traces) | |||
are likely to be safe. Data, such as arguments to functions, may include | |||
user data and needs to be carefully examined. There are many different | |||
types of data that can be released from embarrassing (what website was | |||
visited), to security breach (including cookies/tokens for web sites | |||
that may not be yours), to confidential intellectual property leaking | |||
(source code, designs, etc). Each of these may have different impact on | |||
the user, but should never happen. | |||
Second, crash dumps need to be transmitted confidentially. This means | |||
either using TLS or encrypting the dumps with a tool like GPG before | |||
sending. This ensures that unauthorized parties are unable to view the | |||
contents. The NSA used the dumps to gather information for their | |||
operations, which if Microsoft had properly protected their user's data, | |||
this would not have happened. | |||
Third, they need to be stored in a secure manner and able to be | |||
expunged. It should even be possible for the user to remove the crash | |||
dump if they discover that information was shared when it should not have | |||
been. The life time that a company keeps the dumps should be limited. | |||
If you haven't fixed a bug from five years ago, how do you know you can | |||
reproduce it, or that if you are able to reproduce it, that the code is | |||
still present in your current software? It the crash is a major issue, | |||
it is likely that you'll have more recent dumps that exhibit the same | |||
issue if it is a problem, so old dumps are just not as useful compared | |||
to the data that may be present. | |||
As crash data needs to be deleted, almost any cloud service is immediately | |||
excluded unless other precautions are used, such as encryption. With | |||
the cloud, you have zero visibility into how the data is managed and how | |||
or when it is backed up. Cloud providers rarely tell you their retention | |||
policies on back ups, and other policies that may keep data around. Do | |||
they securely remove your VM's storage when they migrate it? Do they | |||
ensure that storage is deleted from all clones, shards, servers and | |||
backups when you delete it? If not, how long will that data stay around | |||
before it is finally expunged. | |||
Fourth, access to dumps need to be controlled. Auditing is a good first | |||
step to know who is accessing the data, but additional measures like | |||
limiting who has access needs to be used. Not everyone on the team needs | |||
access to them. As they are classified, they can be assigned to teams | |||
or people that need access to the data in them. This helps make sure | |||
that an employee isn't trolling for nudes or other confidential | |||
information. It should also limit how easy data is copied out of the | |||
archive. How these controls are put in place will vary by company. | |||
Edit: Case in point: I recently opened a support case with Apple. | |||
Apple provides a program to collect data to send to them to help trouble | |||
shoot the issue. The program collected 280 MB of data. When uploading | |||
the data, Apple informs the user that it is their responsibility to NOT | |||
submit any personal information that they don't want. There is no way | |||
most people are qualified to look at the data, and even redact it | |||
properly. I | |||
[attempted to do so](https://twitter.com/encthenet/status/1057445997373087744), | |||
and it took a very long time, and I'm not sure that I got everything. | |||
Expecting a normal computer user to be able to do this is insane. |
@@ -0,0 +1,93 @@ | |||
--- | |||
title: TLS Client Authentication Leaks User Info (pre-TLS1.3) | |||
description: > | |||
TLS Client Authentication Leaks User Info (pre-TLS1.3) | |||
created: !!timestamp '2018-10-15' | |||
time: 10:54 AM | |||
tags: | |||
- TLS | |||
- security | |||
--- | |||
It's been long known that TLS is not the best privacy protecting | |||
protocol in that SNI leaks what domain the client connects to. I'm a | |||
bit surprised that I haven't seen the failure to protect user | |||
information when using client authentication mentioned, but it's likely | |||
that TLS client authentication is so rarely used, that this have not | |||
been on anyone's radar. | |||
TL;DR: Just don't use TLS client authentication on anything before TLS | |||
1.3. | |||
With TLS 1.2 and earlier, if you use client authentication, the client | |||
certificate is transmitted in the clear. This contains enough | |||
information to uniquely identify the user. If it didn't, then there | |||
would be no way for the server to do the authentication. | |||
The danger of this is that Eve (eavesdroppers) on path will be able to | |||
track your user's (or your) connections, where they connect from, figure | |||
out how much data they transfer between to/from your site and likely | |||
profile their usage. | |||
I was confident that this was the case as I know that the entire | |||
handshake is in the clear. It isn't till the Finished messages that | |||
the session becomes encrypted. (TLS 1.3 fixed this by using a new | |||
derived key, [sender]_handshake_traffic_secret, to encrypt all the | |||
server params, which the client will use to encrypt it's response to | |||
the certificate request in the server params.) I decided to verify | |||
that this was the case. | |||
I generated a server and a client certificate and key: | |||
``` | |||
openssl req -batch -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout server.key -out server.crt | |||
openssl req -batch -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout client.key -out client.crt | |||
``` | |||
I then launched the server, and included the `-Verify` and `-CAfile` options | |||
for `s_server` to request a client certificate: | |||
``` | |||
openssl s_server -accept 5829 -cert server.crt -key server.key -Verify 5 -CAfile client.crt -debug | |||
``` | |||
Then I ran tcpdump to capture the session: | |||
``` | |||
sudo tcpdump -s 0 -n -i lo0 -w clientcert.tcpdump port 5829 | |||
``` | |||
And then the client to connect to the server: | |||
``` | |||
openssl s_client -connect localhost:5829 -key client.key -cert client.crt -debug | |||
``` | |||
A usual, non-client authenticated connection and close was about 17 | |||
packets, but when I included the client authentication, it became 42 | |||
packets (the answer!). | |||
I loaded the packet capture into wireshark, applied the SSL protocol | |||
analysis and confirmed that the client certificate was present in clear | |||
text: | |||
 | |||
So, there you have it. Do not use client authentication, pre-TLS 1.3, | |||
if you care about the privacy of your users. | |||
It is safe to use client authentication w/ a TLS 1.3 server as long as | |||
the server requires all clients be 1.3 clients. If the key exchange | |||
algorithm is one of DHE_DSA, DHE_RSA, or an ECDH key exchange algorithm, | |||
the random bytes in the Hello messages are signed and these bytes are | |||
used by TLS 1.3 for downgrade protection. As the signature covers these | |||
bytes, the client would be able to detect any attempts to modify the | |||
server or client handshake messages to force a downgrade before it would | |||
send the client certificate. | |||
Thanks to Mike Hamburg for reviewing an earlier version of this blog | |||
post and pointing out that TLS 1.3 was not vulnerable to this and | |||
helping w/ some of the research to prove it. | |||
References: | |||
* [TLS 1.2 Protocol Diagram](https://tools.ietf.org/html/rfc5246#page-36) | |||
* [TLS 1.2 ServerKeyExchange](https://tools.ietf.org/html/rfc5246#page-52) | |||
* [ECC Cipher Suites for TLS ServerKeyExchange Signature](https://tools.ietf.org/html/rfc4492#page-20) | |||
* [TLS 1.3 Protocol Diagram](https://tools.ietf.org/html/rfc8446#section-2) | |||
* [TLS 1.3 Server Hello](https://tools.ietf.org/html/rfc8446#section-4.1.3) Downgrade Protection |
@@ -0,0 +1,3 @@ | |||
extends: blog.j2 | |||
default_block: post | |||
listable: true |
@@ -0,0 +1,106 @@ | |||
--- | |||
title: Using Signal on a server | |||
description: > | |||
Using Signal on a server | |||
created: !!timestamp '2019-04-08' | |||
time: 1:54 PM | |||
tags: | |||
- signal | |||
--- | |||
For a long while, I'd been using an email to SMS gateway to push | |||
important notifications from my server, such as SMART error messages, | |||
to my phone. After all the | |||
[NSA warrantless surveillance](https://en.wikipedia.org/wiki/NSA_warrantless_surveillance_(2001%E2%80%932007)), | |||
I made a commitment to encrypt as much of my communications as possible. | |||
When Signal came out, I adopted it because of it's strong encryption and | |||
privacy. Ever since I've been wanting to use it for notifications from | |||
my server. I finally got around to trying out the CLI version, and got | |||
it to work. | |||
The installation of the command line utility for Signal was more straight | |||
forward than I was expecting. I decided to use | |||
[signal-cli](https://github.com/AsamK/signal-cli) and I was a bit worried, | |||
as it uses Java. Java has historically been difficult to run on FreeBSD | |||
due to lack of support and draconian licensing terms. I was surprised | |||
that the packages for OpenJDK 8 were both present and just worked on my | |||
server. A simple `pkg install openjdk8` got Java up and running. | |||
One thing to note is that the package said that fdesc and proc needed to | |||
be mounted for Java to work, but I did not, and things still worked. | |||
There are likely other parts of Java that may not work w/o those mounted, | |||
but not for Signal. | |||
As I have been using OSS for a long time, I like to build things from | |||
source, so I followed the instructions at | |||
[Building signal-cli](https://github.com/AsamK/signal-cli#building) and | |||
got the command built with out any trouble. | |||
Once the command was built, the | |||
[Usage guide](https://github.com/AsamK/signal-cli#usage) provided the | |||
basics, but didn't include instructions on how to verify the safety | |||
numbers to ensure that the initial exchange was not MitM'd. There is a | |||
[man page](https://github.com/AsamK/signal-cli/blob/master/man/signal-cli.1.adoc), | |||
but it requires a2x and separate steps to build, but a little bit of | |||
digging got me the necessary steps (also, it turns out that the adoc | |||
format is a simple text format). | |||
With a bit of searching, I found the `listIdentities` and `verify` | |||
commands. There may have been another way, but because I had sent a | |||
test message, my phone was listed: | |||
``` | |||
$ signal-cli -u +XXXXXXXXXXX listIdentities | |||
+YYYYYYYYYYY: TRUSTED_UNVERIFIED Added: Sat Apr 06 18:43:15 PDT 2019 Fingerprint: ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ ZZ Safety Number: WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW | |||
``` | |||
And then I needed to use the `trust` subcommand: | |||
``` | |||
$ signal-cli -u +XXXXXXXXXXX trust -v 'WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW WWWWW' +YYYYYYYYYYY | |||
``` | |||
The hardest part of this was figuring out how to invoke the command upon | |||
reception of an email. I used an alias listed in `/etc/aliases` to forward | |||
the email to both the SMS gateway and myself. The issue with trying to | |||
invoke the command from here was that the command was run as the `mailnull` | |||
user, which of course didn't have access to my user's home directory to | |||
read the private key. After a bit of debating, I remembered I use | |||
`procmail`, and realized this was the best way to send the message. | |||
I created a symlink for the command into my user's bin directory, created | |||
a short script called `sendcell`: | |||
``` | |||
$ cat ~/bin/sendcell | |||
#!/bin/sh - | |||
~user/bin/signal-cli -u +XXXXXXXXXXX send +YYYYYYYYYYY | |||
``` | |||
and then added a filter to my `.procmailrc` file. The filter at first | |||
looked like this: | |||
``` | |||
:0Wf | |||
* ^TO_celluser@([^@\.]*\.)*example.com | |||
| sendcell | |||
``` | |||
But after the first test, it included all the headers, including all the | |||
`Received` headers, so I updated it to use `formail` to remove all but the | |||
`From`, `Subject` and `Date` (in case the message gets significantly delayed, | |||
I can see by how much) headers: | |||
``` | |||
:0c | |||
* ^TO_celluser@([^@\.]*\.)*example.com | |||
{ | |||
:0Wf | |||
| formail -k -X From: -X Subject: -X Date: | |||
:0 | |||
| sendcell | |||
} | |||
``` | |||
and now I get the messages delivered to my phone securely! | |||
It is tempting to use this to be able to invoke commands on my server | |||
remotely, but there isn't much I need to do when I don't have my laptop | |||
with me. |
@@ -0,0 +1,3 @@ | |||
extends: blog.j2 | |||
default_block: post | |||
listable: true |