My free software activities, January 2016
Debian Long Term Support (LTS)
This is my second month working on Debian LTS, started by Raphael Hertzog at Freexian. I think this month has been a little better for me, as I was able to push two "DLA" (Debian LTS Advisories, similar to regular DSAs (Debian Security Advisories) but only applying to LTS releases).
phpMyAdmin and Prosody
I pushed DLAs for phpmyadmin (DLA-406-1) and [prosody (CVE-2016-0756)][]. Both were pretty trivial, but I still had to boot a squeeze VM to test the resulting packages, something that was harder than expected. Still the packages were accepted in squeeze-lts and should work fine.
icu and JDK vulnerabilities
I also spent a good amount of time trying to untangle the mess that java software has become, and in particular the icu vulnerabilities, CVE-2015-4844 and CVE-2016-0494. I ended up being able to backport patches and build packages, not without a significant amount of pain because of how upstream failed to clearly identify which patches did what.
The fact that they (Oracle) did not notify their own upstream (icu) is also a really questionable practice in the free software world, which doesn't come as a surprise coming from Oracle anymore, unfortunately. Even worse, CVE-2016-0494 was actually introduced as part of the fix for CVE-2015-4844. I am not even sure the patches provided actually fix the problem because of course Oracle didn't clearly state what the problem was or how to exploit it.
Still: I did the best I could under the circumstances and built packages which I shared with the debian-lts list in the hope others could test it. I am not much familiar with the icu package or even Java anymore, so I do not feel comfortable uploading those fixes directly right now, especially since I just trust whatever was said on the Redhat and icu bugtrackers. Hopefully someone else can pick this up and confirm I had the right approach.
OpenSSH vulnerabilities
I also worked on CVE-2016-1908 a fairly awkward vulnerability in OpenSSH involving bypassing a security check in the X server that forbids certain clients from looking at keystrokes, selections and more stuff from other clients. The problem is pretty well described in this article. It is, basically, that there are two ways for applications to talk to the X server: "trusted" and "untrusted". If an application is "trusted", they can do all sorts of stuff like manipulate the clipboard, send keystrokes to other applications, sniff keystrokes and so on. This seems fine if you are running local apps (a good example is xdotool to test this) but can be pretty bad once X forwarding comes in play in SSH because then the remote server can use your X credentials to run arbitrary X code in your local X server. In other words, once you forward X, you trust the remote server as being local, more or less.
This is why OpenSSH 3.8 introduced the distinction between -X
(untrusted) and -Y
(trusted). Unfortunately, after quite a bit of
research and work to reproduce the issue (i could not not reproduce
the issue!), I realized that Debian has, even since 3.8 has been
released (around the "sarge" days!) forcibly defaulted
ForwardX11Trusted
to yes
which makes -X
and -Y
behave the same
way. I described all of this in
a post to the LTS list and OpenSSH maintainers and it seems there
were good reasons for this back then (-X
actually breaks a lot of X
clients, for example selecting text will crash xterm
), but I still
don't quite see why we shouldn't tell people to use -Y
consciously
if they need to, instead of defaulting to the nasty insecure
behavior.
Anyways, this will probably end up being swept under the rug for
usability reasons, but just keep in mind that -X
can be pretty nasty
if you run it against an untrusted server.
Xscreensaver vulnerability
This one was fun. JWZ finally got bitten by his own rants and a pretty embarrassing vulnerability (CVE-2015-8025) that allowed one to crash the login dialog (and unlock the screen) by hot swapping external monitors (!). I worked on trying to reproduce the issue (I couldn't: my HDMI connector stopped working on my laptop, presumably because of a Linux kernel backport) and building the patches provided by the maintainer on wheezy, and pushed debdiffs to the security team which proceeded with the upload.
Other LTS work
I still spend a bit too much time to my taste trying to find work in LTS land. Very often, all the issues are assigned or the ones that remain seem impossible to fix (like the icu vulnerabilities) or packages so big that I am scared to work on it (like eglibc). Still, the last week of work was much better, thanks to the excellent work that Guido Günther has done on the front desk duties this week. My turn is coming up next week and I hope I can do the same for my fellow LTS workers.
Oh, and I tried to reproduce the cpio issue (CVE-2016-2037) and failed, because I didn't know enough about Valgrind. But even then, I don't exactly know where to start to fix that issue. It seems no one does, because this unmaintained package is still not fixed anywhere...
systemd-nspawn adventures
In testing the OpenSSH, phpMyAdmin and prosody issues, I had high
hopes that systemd-nspawn would enable me to run an isolated
squeeze container reliably. But I had trouble: for some reason,
squeeze does not seem to like nspawn at all. First off, it completely
refuses to boot it because it doesn't recognize it as an "OS root
directory", which, apparently, need the os-release
file (in /etc
,
but it doesn't say that because it would be too easy):
$ sudo systemd-nspawn -b -D /var/cache/pbuilder/squeeze-amd64-vm
Directory /home/pbuilder/squeeze-amd64-vm doesn't look like an OS root directory (os-release file is missing). Refusing.
I just created that as an empty file (it works: i also tried copying
it from a Jessie system and "faking" the data in it, but it's not
necessary), and then nspawn accepts booting it. The next problem is
that it just hangs there: it seems that the getty
programs can't
talk to the nspawn console:
$ sudo systemd-nspawn -b -D /var/cache/pbuilder/squeeze-amd64-vm
Spawning container squeeze-amd64-vm on /home/pbuilder/squeeze-amd64-vm.
Press ^] three times within 1s to kill container.
/etc/localtime is not a symlink, not updating container timezone.
INIT: version 2.88 booting
Using makefile-style concurrent boot in runlevel S.
Setting the system clock.
Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details of our search for an access method.
Unable to set System Clock to: Sun Jan 31 15:57:31 UTC 2016 ... (warning).
Activating swap...done.
Setting the system clock.
Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details of our search for an access method.
Unable to set System Clock to: Sun Jan 31 15:57:31 UTC 2016 ... (warning).
Activating lvm and md swap...done.
Checking file systems...fsck from util-linux-ng 2.17.2
done.
Mounting local filesystems...done.
Activating swapfile swap...done.
Cleaning up temporary files....
Cleaning up temporary files....
INIT: Entering runlevel: 2
Using makefile-style concurrent boot in runlevel 2.
INIT: Id "2" respawning too fast: disabled for 5 minutes
INIT: Id "1" respawning too fast: disabled for 5 minutes
INIT: Id "3" respawning too fast: disabled for 5 minutes
INIT: Id "4" respawning too fast: disabled for 5 minutes
INIT: Id "5" respawning too fast: disabled for 5 minutes
INIT: Id "6" respawning too fast: disabled for 5 minutes
INIT: no more processes left in this runlevel
Note that before the INIT
messages show up, quite a bit of time
passes, around a minute or two. And then the container is just stuck
there: no login prompt, no nothing. Turning off the VM is also
difficult:
$ sudo machinectl list
MACHINE CONTAINER SERVICE
squeeze-amd64-vm container nspawn
1 machines listed.
$ sudo machinectl status squeeze-amd64-vm
squeeze-amd64-vm
Since: dim 2016-01-31 10:57:31 EST; 4min 44s ago
Leader: 3983 (init)
Service: nspawn; class container
Root: /home/pbuilder/squeeze-amd64-vm
Address: fe80::ee55:f9ff:fec5:f255
2001:1928:1:9:ee55:f9ff:fec5:f255
fe80::ea9a:8fff:fe6e:f60
2001:1928:1:9:ea9a:8fff:fe6e:f60
192.168.0.166
Unit: machine-squeeze\x2damd64\x2dvm.scope
├─3983 init [2]
└─4204 lua /usr/bin/prosody
$ sudo machinectl poweroff squeeze-amd64-vm
# does nothing
$ sudo machinectl terminate squeeze-amd64-vm
# also does nothing
$ sudo kill 3983
# does nothing
$ sudo kill -9 3983
$
So only the latter kill -9 worked:
Container squeeze-amd64-vm terminated by signal KILL.
Pretty annoying! So I ended up doing all my tests in a chroot, which
involved shutting down the web server on my laptop (for phpmyadmin) and
removing policy-rc.d
to allow the services to start in the
chroot. That worked, but I would prefer to run that code in a
container. I'd be happy to hear how other maintainers are handling
this kind of stuff.
For the OpenSSH vulnerability testing, I also wanted to have a X server running from squeeze, something which I found surprisingly hard. I was not able to figure out how to make [qemu][] boot from a directory (the above chroot), so I turned to the Squeeze live images from the cdimage archive. Qemu, for some reason, was not able to boot those either: I would only get a grey screen. So I ended up installing Virtualbox, which worked perfectly, but I'd love to hear how I could handle this better as well.
Other free software work
As usual, I did tons more stuff on the computer this month. Way more than I should, actually. I am trying to take some time to reflect upon my work and life these days, and the computer is more part of the problem than the solution, so those feel like a vice that I can't get rid of more than an accomplishment. Still, you might be interested to know about those, so here they are.
Ledger timetracking
I am tracking the time I work on various issues through the overwhelming org-mode in Emacs. The rationale I had was that I didn't want to bother writing yet another time tracker, having written at least two before. One is the old phpTimeTracker, the other is a rewrite that never got anywhere, and finally, I had to deal with the formidable kProject during my time at Koumbit.org. All of those made me totally allergic to project trackers, timetrackers, and reinventing the wheel, so I figured it made sense to use an already existing solution.
Plus, org-mode allows me to track todos in a fairly meaningful way and I can punch into todo items fairly transparently. I also had a hunch I could bridge this with ledger, a lightweight accounting tool I started using recently. I was previously using the heavier Gnucash, almost a decade ago - but I really was seduced by the idea of a commandline tool that stores its data in a flat file that I can checkin to git.
How wrong I was! First off, ledger can't read org files out of the box. It's weird, but you need to convert those files into timeclock.el formatted files, which, oddly enough, is a completely different file format, and completely different timetracker. Interestingly, it's a very interesting format. An example:
i 1970-01-01 12:00:00 project test 4h
o 1970-01-01 16:00:00
... which makes it possible to write a timetracker with two simple shell aliases:
export TIMELOG=$HOME/.timelog
alias ti="echo i `date '+%Y-%m-%d %H:%M:%S'` \$* >>$TIMELOG"
alias to="echo o `date '+%Y-%m-%d %H:%M:%S'` >>$TIMELOG"
How's that for simplicity!
So you use John Wiegley's org2tc (or my fork which adds a few improvements) to convert from org to timeclock.el. From there on, a bunch of tools can do reporting on those files, the most interesting being obviously ledger itself, as it can read those files natively (although hledger has trouble including them). So far so good: I can do time tracking very easily and report on my time now!
Now, to turn this into bills and actual accounting, well... it's really much more complicated. To make a long story short, it works, but I really had to pull my hair out and ended up making yet another git repository to demonstrate how that could work. I am now stuck at the actual step of generating bills more automatically, which seems to be a total pain. Previous examples and documentation I found were limited and while I feel that some people are actively doing this, they still have to reveal their magic sauce in a meaningful way. I was told on IRC no one actually achieved converting timeclock.el entries directly into bills...
Kodi
I have done a small patch to the rom collection browser to turn off an annoying "OK" dialog that would block import of ROMs. This actually was way more involved than expected, considering the size of the patch: I had to export the project to Github since the original repository at Google Code is now archived, just like all Google Code repositories. I hope someone will pick it up from there
Sopel
I have finally got my small patch for SNI support in Sopel! It
turns out they are phasing out their own web
module in favor of
Requests, something that was refused last year. It seems the
Sopel developers finally saw the interest in avoiding the maintenance
cost of their own complete HTTP library... in an IRC bot.
Working on this patch, I filed a bug in requests which was promptly fixed.
https://github.com/sopel-irc/sopel-extras/pull/58#issuecomment-66293602
Feed2tweet and spigot
I already mentioned how I linked this blog to Twitter through the use of feed2tweet. Since then, part of my pull requests and issues were merged and others are still pending.
In the meantime, I figured it would make sense to also post to identi.ca. This turned out to be surprisingly more difficult - the only bridge available would not work very well for me. I also filed a bunch of issues in the hope things would stabilize, but so far I have not made this work properly.
It seems to me that all of this stuff is really just reinventing the wheel. There are pretty neat IM libraries out there, one that is actively developed is libturpial, used in the Turpial client. It currently only supports status.net and Twitter, but if Pump.io support is implemented, it would all of the above problems at once...
https://github.com/chaica/feed2tweet/issues?q=author%3Aanarcat+sort%3Aupdated-desc
Git-mediawiki
Did I mention how awesome the git-mediawiki remote is? It allows me to clone Mediawiki wikis and transparently read and write to them using usual git commands! I use it to keep a mirror of the amateur radio wiki site, for example, as it makes no sense to me to not have this site available offline. I was trying to mirror Wikivoyage and it would block at 500 pages, so I made a patch to support larger wikis.
Borg resignation
Finally, it is with great sadness that I announce that I have left the Borg backup project. It seems that my views of release and project management are irreconcilable with those of the maintainer of the Attic fork. Those looking for more details and explanations are welcome to look in the issue tracker for the various discussions regarding i18n, the support timeframe and compatibility policy, or to contact me personally.
Hi, I made a project that permits to make this kind of work, named TriggerHappy. If you know IFTTT, its an opensource alternative to this one. So TriggerHappy is able to grab data from various sources of your choice like feeds (rss/atom) and publish the new content on twitter or anywhere else like Pocket,Readability, Evernote, GitHub and so on. Currently I dont have try to support identi.ca yet but there is a good python client for this one
apparently, this seems necessary for the console to work with nspawn in squeeze - progress!