Daily Automatic Updates, Safely
LLMs are finding vulnerabilities faster than ever. Let CI update your dependencies, images and OS daily, with tests, rollbacks and cool-off periods.
Searches stay local. No external search engine is involved.
LLMs are finding vulnerabilities faster than ever. Let CI update your dependencies, images and OS daily, with tests, rollbacks and cool-off periods.
The PowerDNS API key grants full access, so I wrote PDNS-API-Cage, a proxy that lets Traefik touch only the ACME records it needs in chosen zones.
I used to recommend GKG. One of their nameservers fails on IPv6, the nameserver form is broken and support never replies, so I now warn people off.
I rebuilt PowerDNS Recursor as a static scratch image with Landlock and a seccomp allowlist, daily rebuilds, an SBOM, OpenVEX and cosign signatures.
A year on, Evolution Mail's tracking, gzip bomb and attachment cache bugs are all still open. I went back to it, but only with Sanimail cleaning my mail.
Sanimail, my open source mail filter, inlines remote images, sanitises HTML by policy, strips tracking parameters and handles PGP and S/MIME.
calendiff is my self hosted tool that checks an ICS feed from cron and reports changes. Its cal2email tool sends tidy emails, with filters for noisy edits.
My Claude sandbox injects API credentials through a mitmproxy sidecar so the model never sees them, with websocket, GraphQL and token refresh support.
Tesla's app added an AI Home Status summary with an 'AI can make mistakes' warning. Better to have AI write deterministic code once than call a model.
After the Axios supply chain attack: my Safernode wrapper runs npm inside a podman container, so a malicious package only sees the current directory.
A 'fiercely privacy-first' company sent its legal update with about 1,000 customer addresses in the To header, then an apology that said only 'some'.
From 15 March 2026, CAs must validate DNSSEC on CAA lookups and ACME checks. I've run DNSSEC for 14 years; see if your registrar supports it.
The tests I run on this website: Go unit and integration tests, vnu validation, Playwright in three browsers, axe-core, pixel-exact screenshots and more.
My open source Django site: paste raw email source and see its IPs, URLs, MIME tree and rendered parts, with local translation. Easy to run in Docker.
I rebuilt grepular.com in Go with posts in markdown. Notes on SVG sprites, Early Hints, speculation rules, browser tests and a single embedded binary.
In my tests, iPhone Mail didn't prefetch remote content as Apple claims, and leaked via DNS prefetch. Apple closed my report. Use these settings.
A tiny sshx wrapper runs mosh with screen, so my SSH sessions survive network changes, sleeping for days and even a laptop reboot.
I served a 10MB gzip bomb as an image in HTML email. Most clients and proxies coped, iOS Mail crashed and Evolution wrote 100GB of cache to my disk.
I added a link preconnect test to the Email Privacy Tester. Evolution's developers called my last post a smear and locked the bug thread instead.
A dns-prefetch tag in an HTML email makes Evolution Mail do a DNS lookup on open, even with remote content blocked. The developers blame WebKitGTK.
A few lines of config with libnginx-mod-http-geoip on Debian 12 that show visitors from Russian IPs a plain text message instead of your site.
My Gitlab runner emails me when it pushes a new Docker image. No webhook service needed, just curl talking to an authenticated SMTP server on port 465.
Skiff fetched blocked remote content in the background, leaked IPs on iOS until a later fix, and skipped MTA-STS. Its CEO called my report disinformation.
A shebang trick that makes a Dockerfile executable: running it builds the image with podman and runs it with your args. My example wraps yt-dlp.
I keep cargo in Docker with saferrust. Getting rust-analyzer in VS Code to work the same way took a wrapper script, a custom image and a sudo rule.
Running iptables and pcap from a Node app in Docker without root: a setuid xtables binary, setcap on node, NET_ADMIN and NET_RAW, and host networking.
I replaced Restic's Rest Server with plain Nginx, using the DAV and Lua modules and JSON autoindex to give append-only backups with per-host credentials.
I wrote funcTwitter, a GPL NodeJS app that runs on Google Cloud's free tier and turns Twitter accounts or searches into RSS. It stopped working in 2023.
With OpenSSH 6.7 or later on Debian Stretch, one RemoteForward line in ~/.ssh/config lets me use gpg on a server without my private keys being on it.
The Keybase extension injects its chat box into the page, so Reddit, Twitter and the others can read what you type and send messages as you. Use the app.
Changes to a friend's mailing list broke first my DKIM signature, then my SPF, and DMARC began rejecting my mail. Plus an XSS bug in dkimvalidator.com.
My small Perl script warns when a PGP master key or subkey is close to expiry. It prints nothing otherwise, so a daily cron job emails me only when needed.
Lavabit's IMAP and SMTP servers accepted my login over an unencrypted connection. They should require STARTTLS and refuse authentication without it.
A sticky React table header lagged on big tables. requestAnimationFrame barely helped, removing needless setState calls did. IntersectionObserver is next.
I use OwnTracks with my own Mosquitto MQTT server to track and share my phone's location without a third party, even running it over a Tor hidden service.
My primary MX hung, accepting TCP connections but sending no SMTP banner. GMail, Sendgrid and Github waited on it for a week and never tried my backup MX.
Chrome and Firefox disagree on IDN addresses in type=email inputs: punycode, validity and the value JavaScript sees. Feature detection is the workaround.
DNSCrypt hides DNS lookups from your ISP but shows them to whoever runs the resolver, and SNI and IPs still reveal your browsing. Use Tor or a VPN.
MongoDB sorts case sensitively and Minimongo can't do aggregation, so case insensitive sorting with reactive pagination in Meteor needs ugly workarounds.
With PGP subkeys on a Yubikey Neo, I sign and decrypt mail in K-9 and OpenKeychain over NFC, so my Android phone never has access to my keys.
OpenVPN, Orbot and orWall gave my rooted phone per-app network rules, but Android's in-kernel DNS resolver lets blocked apps leak data through DNS lookups.
I put an XML external entity in my RSS feed to see which readers would fetch it. Tiny Tiny RSS and Perl's XML::Feed did, and both have since been fixed.
Checking an email domain has MX, A or AAAA records in Perl, with all three lookups sent at once via Net::DNS bgsend and IO::Select so nothing blocks.
A Debian dist-upgrade took GnuPG::Interface to 0.48, which broke Mail::GnuPG and so my gpgit script. This is the patch to apply to Mail/GnuPG.pm first.
An SVG link in an HTML email made Thunderbird open sites in its own tab, bypassing my Firefox extensions and proxy. Unfixed 26 months after I reported it.
Any device on my LAN can reach .onion sites with no setup. Unbound forwards to Tor's DNSPort, iptables redirects to TransPort, Tor2webMode cuts the hops.
My Debian router lets any device on my LAN open .i2p sites with no proxy settings, using Unbound for .i2p lookups, iptables and Privoxy feeding I2P.
My dual boot desktop puts SSD caches in front of a fakeRAID stripe: BCache on Linux, Intel Smart Response on Windows. Setup, pitfalls and hit rates.
XSS flaws I found in FastMail webmail: JavaScript in SVG attachments, a content type filter bypass and unescaped filenames, and the fixes I suggested.
I run Dropbox as its own Linux user shared over Samba, then add AppArmor, disk quotas, iptables rules forcing its traffic over Tor, and EncFS for files.
The Email Privacy Tester gets its own domain and GPL source, plus tests for video poster leaks in Android's mail app, K-9 and Hotmail, and read receipts.
APG wouldn't import GnuPG subkeys exported without the master key, so I forked it and removed the checks. How subkeys work and why I use them.
I keep my SSH key on an OpenPGP smart card, using a GnuPG authentication subkey and gpg-agent on Linux, plus a pageant replacement for Putty on Windows.
T-Mobile UK was injecting spoofed TCP RST packets to kill TLS SMTP and OpenVPN. Dropping RST packets with iptables at both ends got my VPN working again.
Smart phones need charging every night. An extended life battery for about $15 can double that, with a bulging back cover. I use one in my HTC Desire Z.
My laptop backups: hourly GPG encrypted Duplicity increments of the whole filesystem to a NAS, and code synced instantly through Dropbox under EncFS.
I uninstalled TextSecure because it didn't work with my inPulse watch. Days later Twitter open sourced it, so I forked it and added basic watch support.
How I set up DNSSEC on grepular.com with Bind: RRSIG, DNSKEY and DS records, KSKs and ZSKs, NSEC zone walking, key rollovers, and uses like SSHFP and DANE.
EximPhishReplyBuster remembers the password a user logged in with and rejects outgoing mail containing it, so replies to phishing emails never leave.
RequestPolicy lets clicked links and form submits through, leaving room for CSRF and clickjacking. I patched my copy to ask about every cross-site request.
After Comodo and DigiNotar, I propose certificates signed by several independent CAs, so forgery gets harder and no CA is too big to remove from browsers.
How I secured a ThinkPad: a Windows honeypot with Prey for thieves, TRESOR against cold boot, a USB boot stick for evil maids, and a separate Firefox user.
ETags, Last-Modified values, cached CSS and canvas-decoded images can all track you without cookies. I disabled Firefox's disk and memory cache to stop it.
Firefox 4 and 5 copied every request header into CSP violation reports, including Proxy-Authorization, so any website could log a visitor's proxy password.
See someone type their OpenPGP smartcard PIN, steal the card, and you have their keys. My Perl pinentry wrapper adds a second password kept on the laptop.
A view-source: iframe got past RequestPolicy and loaded a page from another domain. It was fixed within hours of my report. Check your own URL parsing.
FireGPG is discontinued and broke again with Firefox 5. A developer called bit has fixed it, and here is how to clone that fork into your Firefox profile.
Boxee POSTs every show I watch, and when, to app.boxee.tv. Its privacy policy doesn't mention it and my email went unanswered, so I block it.
Why I welcome the EU cookie law even though it makes my job harder, and the four changes I made so this site no longer sets cookies.
Building an EWS calendar app, I found Exchange sends private appointments in full to anyone with Reviewer access and leaves the client to hide them.
DroidWall on a rooted Android phone lets you pick which apps may use the network, separately for wifi and 3G, using iptables per-uid owner rules.
tcpdump showed the Dropbox Android app sending file metadata unencrypted, contrary to their security page. Dropbox said it was a speed trade-off.
Kik sent its XMPP messages unencrypted, so I wrote kiksig.pl, a proof of concept that silently adds a signature to messages sent over your Wifi.
A carriage return in an email parameter gave me XSS on lastpass.com, exposing a user's email address, password reminder, saved sites and login history.
A local script that 302 redirects to a protocol relative //host URL got cross-origin scripts past the RequestPolicy Firefox addon. Since fixed.
Exim now takes a copy of each email I send, encrypts it with gpgit and appends it to my Dovecot Sent Items folder using pipe2imap.
Eight problems I found in Convore at launch, including XSS in linked URLs, an open redirect, CSRF on group joins and public online status.
Spam reached the address I gave only to BulkSMS. Unlike most companies, they investigated, changed email provider and set up honeypot addresses.
Hidden img and script tags with onload and onerror let any site tell if you're logged into GMail, Facebook, Twitter or Digg. Google called it expected.
A 拢15 TEMPer USB thermometer, a short Perl script on my Ubuntu HTPC and RRDtool give me living room temperature readings over SSH and graphs over time.
gpgit, my Perl script that Exim runs as a transport filter, PGP encrypts every incoming email with my public key before it reaches my IMAP server.
On Debian Lenny and Ubuntu, running 'at tomorrow' on 31 December 2010 scheduled the job for January 2012, a full year late. Check the date it reports.
A PKA TXT record at local_part._pka.domain holds your key's fingerprint and URL, and gpg with auto-key-locate will fetch it. No keyservers needed.
I wrote a Perl module that applies the EFF's HTTPS Everywhere rulesets to URLs. It rewrites links on this site and powers a Squid redirector for my LAN.
Why this site used a free CAcert certificate in 2010 despite browser warnings, why I resent paying CAs, and my hope for certificate fingerprints in DNSSEC.
Sniffing Kik with Wireshark showed unencrypted XMPP carrying usernames, plain text passwords and messages. Kik has since added SSL.
With tcpdump I saw my MSN contacts' email addresses cross the network in plain text. ICQ, MSN and Yahoo send chats unencrypted. Use GTalk and OTR instead.
Tor is slow with three hops. I patched DEFAULT_ROUTE_LEN and rebuilt the Debian package on Ubuntu Lucid for two-hop circuits, at some cost to anonymity.
SVG images can carry JavaScript, so sites displaying user uploaded SVGs are open to XSS. Workarounds, and a new SVG test in the Email Privacy Tester.
With 'Load Remote Images' off, iOS 4 Mail still follows dns-prefetch link tags, telling the sender when an email is read and which DNS servers you use.
Switching my address from googlemail.com to gmail.com left my Android G1 retrying Market updates all day and draining the battery. It broke GTalk too.
I gave my Linode VPS IPv6 through a free Hurricane Electric tunnel in minutes, then set up AAAA records, reverse DNS, mail, Apache and ip6tables.
Google's SSL search hides the Referer from HTTP sites, upsetting search analytics. My site still gets it over HTTPS, and I think that is a good incentive.
DuckDuckGo didn't log IPs, but favicons loaded from Amazon S3 leaked every search term in the Referer header. It was fixed two days after I posted.
Vuze falls back to direct connections when its SOCKS proxy fails. I forced Java through Tor, turned off DHT and UPnP and blocked UDP to stop IP leaks.
A few string expansions in Exim's DATA ACL pull every IPv4 address out of the Received headers for DNSBL checks. Skip Spamhaus PBL results when you do.
Dropping SpamAssassin to save memory, I wrote a GPL Perl script that pulls domains out of message bodies so Exim can check them against RHSBLs.
If a certificate hash could be published in a DNSSEC signed zone, domain owners could prove a self-generated cert is theirs without paying a commercial CA.
I stopped keeping an encrypted password file. I mash the keyboard for a random password, let the browser save it, and use the reset link if I need it.
Tracking outbound link clicks without an open redirect: mod_rewrite does the redirect and mod_security checks a salted MD5 token on the URL.
Bots fill in a hidden confirm_email field on my comment forms that people never see. A chained ModSecurity rule in Apache rejects them with a 403.
An online tool I built that emails you and reports which tracking callbacks your email client makes, after I found leaks in Apple Mail and others.
An HTML email with a meta refresh pointing at an empty text/plain file crashes the iPhone mail client, which then has to re-sync all your email.
Android's stock IMAP client loads remote stylesheets and iframes in HTML email as soon as you open it, even with images off, telling the sender.
Adding Strict-Transport-Security and X-Frame-Options headers to my site with Apache mod_headers, after Google announced support for them in Chrome.
Source for my G1 battery graphing tool: the Java Android app that uploads battery status over HTTP and the Perl CGI that draws rrdtool graphs.
Thunderbird, GMail and Hotmail prefetch DNS for links in an email even with remote images blocked, so a sender can tell it was read. Fixes included.
On 1 January 2010 the FH_DATE_PAST_20XX rule started scoring every legitimate email 3.2 because of a bad regex. Here is the one-line local.cf fix I used.
Calling google.load for Google's language API blocks on pages built with client side XSLT. My workaround was a hidden iframe, and a horrible one at that.
Debenhams' mail software choked on my multi-line SMTP banner, sent malformed MAIL FROM commands and was on several blacklists. Little of it got through.
A trailing comma after the last item in an object literal is fine in Firefox but breaks Internet Explorer. It is a Perl habit I keep falling foul of.
Squid wouldn't gzip responses over my slow 3G link, so I switched to Apache mod_proxy as a forward proxy with mod_deflate. Here is my config.
A mod_perl output filter that minifies JavaScript on the fly with Google Closure Compiler, cached because the Java compiler is slow. 8.3KB became 4.5KB.
The leaked Poundhost list spread. GameServersDirect mailed it with everyone in Cc again, then FPSGame tried to poach them, using DNS hosted at Poundhost.
I wrote a mod_perl output filter that minifies CSS as Apache serves it, using CSS::Minifier::XS, so there's no separate compressed copy to maintain.
On my G1 it was quicker to SSH in and run mutt than wait for the Android email client. It is slow, lacks IMAP IDLE and got flaky after the 1.6 update.
Four of six replies to Gumtree flat adverts came from 419 scammers in Lagos wanting Western Union receipts. Some simple ways Gumtree could stop it.
One line of crontab fetches my home page every hour with wget, greps for the expected title and emails me through MAILTO if it is missing.
With remote images turned off, Apple Mail and the iPhone still loaded HTML5 video and audio tags, so senders could tell when I read their email.
Poundhost, Demon and Livejournal all leaked user email addresses in the same week of 2009. That is why I give every company its own address.
The BBC ranked Three above T-Mobile for mobile broadband speed, though they share the same 3G network, and ignored latency, which matters more.
Poundhost leaked its customer list by putting everyone in Cc on a marketing email. Within hours, competitor RapidSwitch emailed me a six months free offer.
My experience of Poundhost's iSCSI storage with GFS and Red Hat Cluster Suite: cheap, about 8MB/s over 100Mb NICs, and no SLA without replication.
Exim records the Message-Id of mail I send in MySQL. Replies with a matching In-Reply-To header skip spam filtering, so whole threads become trusted.
I abused Squid's url_regex ACLs and deny_info to send requests for chosen sites through the CTunnel CGIProxy service, hiding my IP from those sites.
After SaneSecurity listed 'com' as a bad domain, I set up a cron job that scans my read Inbox with ClamAV every 20 minutes to catch false positives early.
An Exim ACL that accepts mail for addresses like 2009-Aug-03@tmp.grepular.com until that date, then rejects it. No new alias needed each time.
Two Exim macros using the ${readsocket} expansion to set and get values in memcached from ACLs, with expiry, plus a bug in Debian Lenny's package.
Exim records every address my users send mail to in MySQL, using a stored function and two macros, then skips spam filtering for mail from those senders.
SSH over O2 and Orange 3G was frustratingly laggy for me, but on T-Mobile it felt like wired broadband. High latency is not a limitation of 3G itself.
Exim config that reads smart host IPs, logins and auth types from one file, then picks PLAIN, LOGIN or CRAM-MD5 and TLS for each host automatically.
My CGPContactLookup Perl script lets Exim check senders against CommuniGate Pro Contacts over IMAP, so mail from people I know skips spam checks.
Exim still rejects spam at SMTP time, but fakereject and my pipe2imap script file a copy in each user's read-only IMAP Junk folder for a week.
Apache BrowserMatch rules that send raw XML to browsers with client side XSLT and use mod_xslt for the rest. Later I gave up on the client side.
At Loughborough University I wrote Kochi, a GPL Perl framework that blocks outgoing email containing working login details. It talks the ClamAV protocol.
I emailed Livejournal about Phorm Webwise reading friends only posts, and their Director of Engineering had every subdomain added to the exclusion list.
A background service I wrote for my Android G1 uploads the battery level to my server, where RRDtool draws hourly, daily and weekly graphs of it.
BT's Phorm Webwise system profiles browsing for targeted adverts. Website owners can opt out by email; here is my request and Phorm's confirmation.
Thanks! Mike will get a notification.
JavaScript is disabled. These keyboard shortcuts require JavaScript to function.