Como fazer solicitações de API REST aos serviços ocultos do Tor a partir de um APK Android

Rafael Ortiz    27 mayo, 2020
Como fazer solicitações de API REST aos serviços ocultos do Tor a partir de um APK Android

Encontraremos uma prova de conceito na área de Inovação e Laboratório como parte da arquitetura necessária para criar um serviço oculto do Tor. Não é um aplicativo móvel para esse serviço, é oculto através de uma API JSON. No entanto, parece que não existem muitas maneiras (bem documentadas) de realizar essa tarefa que parece simples a prinicipio. Vamos compartilhar nossas notas, veja como adicionar esse suporte ao seu aplicativo.

Se não for interessado na parte de contextualização, poderá ir direto para a parte «Implementação»

Contexto

Primeiro, vamos dar uma olhada nos diferentes blocos de construção que vamos precisar para fazer solicitações para um serviço oculto do nosso aplicativo. As explicações supõem que você tem noções básicas de desenvolvimento de aplicativos para Tor e Android.

Orbot, NetCipher e o Projeto Guardian

Orbot é um aplicativo gratuito para Android que atua como um  proxy Tor para o seu dispositivo. Como se você estivesse executando o serviço Tor em seu telefone, assim como você faria em qualquer outro sistema Linux.  Orbot foi desenvolvido pelo Guardian Project,que cria e mantém muitos aplicativos Android focados em privacidade. Eles são a equipe por trás do Tor Browser para Android (oficialmente aprovado), bem como o combo Orfox+Orbot que veio antes.

No entanto, forçar um usuário a instalar e executar o Orbot antes de executar seu aplicativo não é uma experiência agradável. Para corrigir isso, NetCipher foicriado. O NetCipher fornece, entre outras coisas, uma classe de utilitárioor OrbotHelper que permite que o aplicativo verifique se o Orbot está instalado, incentive o usuário a instalá-lo facilmente e execute automaticamente o Orbot em segundo plano quando o aplicativo for iniciado.  O processo é análogo ao de quando o pacote do navegador Tor lança um serviço Tor em segundo plano.

No entanto, não é exatamente a mesma coisa. O navegador oficial atual do Tor para Android remove o NetCipher e o Orbot como um requisito, e opta por incluir o Tor no próprio aplicativo. Isso dá aos usuários do navegador Tor uma experiência simples e integrada entre as plataformas. No entanto, usaremos o Orbot, pois sua integração é muito mais simples do que adicionar um daemon Tor ao nosso aplicativo.

Volley Library E ProxiedHurlStack

Exemplos fornecidos para muitas bibliotecas HTTP Android diferentes podem ser encontrados na página do gitlab da biblioteca netCipher. Os principais métodos suportados são HttpUrlConnection, OkHttp3, HttpClient e Volley. Há também exemplos de implementações para cada uma dessas técnicas.

Infelizmente, esses exemplos associados a eles para outros clientes HTTP não funcionam na primeira vez. A maioria deles não foi usada em praticamente um ano, e parece que o método padrão de implementação do tor passou de NetCipher+Orbot (análogo ao proxy da instalação local do FireFox via Tor) para um serviço Tor integrado ao próprio APK (análogo ao pacote do navegador Tor).

Depois de algumas tentativas, acontece que você realmente não precisa do info.guardianproject.netcipher:netcipher-volley artefato para o Tor trabalhar no aplicativo. Se você der uma olhada na fonte do StrongHurlStack.java, você pode ver que é bastante simples de reimplantar. Também batemos com este post stackoverflow que descreve o mesmo conceito. O exemplo não inclui um SSLSocketFactory como o StrongHurlStack  faz,  mas podemos contar com o Tor para fornecer a criptografia de ponta a ponta e a segurança de identidade que o SSL forneceria.  Para serviços ocultos tor, ssl é redundante.

Implementação

Para este processo, assumimos que o usuário já possui uma API acessível como um serviço oculto em somesite.onion.

As dependências a serem adicionadas ao arquivo build.gradle  no nível do aplicativo são as seguintes:

dependencies {
    implementation 'com.android.volley:volley:1.1.1
    implementation 'info.guardianproject.netcipher:netcipher:2.1.0
}

Certifique-se de atualizar as versões mais recentes no momento da implantação.

Em seguida, crie um arquivo e classe ProxiedHurlStack.java;conforme descrito nas amostras do NetCipher e no post stackoverflow e adicione-o ao seu projeto.

package your.app.here;

import com.android.volley.toolbox.HurlStack;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.net.URL;

public class ProxiedHurlStack extends HurlStack {
    @Override
    protected HttpUrlConnection createConnection(URL url) throws IOException {
        Proxy proxy = new Proxy(
                Proxy.Type.SOCKS,
                InetSocketAddress.createUnresolved("127.0.0.1", 9050)
        );
        return (HttpURLConnection) url.openConnection(proxy);
    }
}

Agora, em nosso arquivo MainActivity.java,  podemos importar todas as bibliotecas correspondentes.

package your.app.here;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONObject;

import info.guardianproject.netcipher.proxy.OrbotHelper;

Em seguida, iniciamos uma solicitação para init() e instalaOrbot() a partir do nosso método onCreate()para executaro Orbot em segundo plano. Se o Orbot já estiver instalado, init() retornará verdadeiro e pedirá ao Orbot para se conectar à rede Tor. Mas se o Orbot ainda não estiver instalado, init() retornará falso e o usuário será redirecionado para a Play Store para instalar o Orbot. Quando a instalação estiver concluída, o aplicativo dirá ao Orbot para criar uma conexão com a rede Tor.

@Override
protected void onCreate(Bundle savedInstanceState) {

    // ... other actions here ...

    if (!OrbotHelper.get(this).init()) {
        OrbotHelper.get(this).installOrbot(this);
    }
}

Agora podemos fazer uma solicitação via JSON para o nosso serviço oculto. Você deve adicionar a próxima parte, não importa para onde você envia solicitações para a API.

JSONObject jsonBody = new JSONObject("{\"your payload\": \"goes here\"}");
RequestQueue queue = Volley.newRequestQueue(this, new ProxiedHurlStack());
String url = "http://somesite.onion/your/api/endpoint/here";

JsonObjectRequest jsonRequest = new JsonObjectRequest(
    Request.Method.POST, url, jsonBody,
    new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            // do something with the response
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // do something with the error
        }
    }
);

queue.add(jsonRequest);

E é isso! Agora você pode testar seu aplicativo e ver as solicitações da API para o seu serviço oculto.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *