How to Hide Information in Images

By  on  

If you've followed this blog, you know that I'm obsessed with figuring out every way to interact with, abuse, and convert different types of media.  Whether it's images, video, or audio, if something can be changed or exploited, I want to figure out how to do it.

I remember reading in the past about how images could be used to pass on "secret" information or even install viruses, all the while displaying as proper images in browsers; this process is called steganography.  I wanted to figure out how you could exploit an image to, at the very least, contain information not visible to the user.  Let's look at a few different methods!

Adding EXIF Data

Unbeknownst to most users sharing photos, those images have data attached to them that the photographer realizes: latitude and longitude, device, and lots of other information.  For this reason alone I wrote Get and Remove EXIF Data, a post every service that allows image uploads should read, simply to keep their users privacy.

You can set EXIF data in an image to pass on dubious information:

# Put information in the EXIF
exiftool -artist=MY_SEMI_SECRET_DATA walshcoin.gif

# Retrieve the new info from the EXIF
exiftool walshcoin.gif

The image displays just as it did before but passes information unseen to the user!

Concatenating ZIP Files and Images

This method is the scarier of the two I'll illustrate.  You can actually concatenate an animated GIF and a ZIP file and the image will display while you can also unzip the GIF!

# Concatenate a legit GIF with a secret ZIP file!
$ cat bitcoin.gif >> bitcoinsecret.gif
$ cat secret.txt.zip >> bitcoinsecret.gif

# When you unzip the file, the secret file is there!
$ unzip bitcoinsecret.gif

It's wild that you can concatenate an image and a ZIP file and the result is both extractable and displays properly in a browser!

The methods I've illustrated in the post are incredibly tame -- there are likely many other dubious ways to exploit images so that the average user doesn't know that they're vulnerable.  The ease with which you can add arbitrary information to an image should be unsettling -- the images, at face value, show no sign of modification, but the truth is that they can tell a different story to someone looking for that information!

Recent Features

  • By
    Create a CSS Flipping Animation

    CSS animations are a lot of fun; the beauty of them is that through many simple properties, you can create anything from an elegant fade in to a WTF-Pixar-would-be-proud effect. One CSS effect somewhere in between is the CSS flip effect, whereby there's...

  • By
    Camera and Video Control with HTML5

    Client-side APIs on mobile and desktop devices are quickly providing the same APIs.  Of course our mobile devices got access to some of these APIs first, but those APIs are slowly making their way to the desktop.  One of those APIs is the getUserMedia API...

Incredible Demos

  • By
    Reverse Element Order with CSS Flexbox

    CSS is becoming more and more powerful these days, almost to the point where the order of HTML elements output to the page no longer matters from a display standpoint -- CSS lets you do so much that almost any layout, large or small, is possible.  Semantics...

  • By
    Disable Autocomplete, Autocapitalize, and Autocorrect

    Mobile and desktop browser vendors do their best to help us not look like idiots by providing us autocomplete, autocorrect, and autocapitalize features.  Unfortunately these features can sometimes get in the way;  we don't always want or need the help they provide.  Luckily most browsers allow...

Discussion

  1. Hi, David,

    what you are describing here is known as Steganography:
    https://en.wikipedia.org/wiki/Steganography

    Of course, there are packages on npm for this: https://www.npmjs.com/search?q=steganography

    I haven’t looked into their implementation, yet.

    Cheers

    André

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!