Detectando Root e Jail Broken no seu aplicativo React Native
Published: 2021-12-29 17:36:28

# O que é root e jail-broken?


## root

Fazer o root no seu aparelho significa se tornar um superusuário, ou administrador do sistema. Isso implica ter acesso a partes do Android que antes ficavam inacessíveis para um usuário comum. Sim, a grande vantagem é ganhar controle total do seu celular e do seu sistema operacional

## jail-broken

O jailbreak é uma alteração, um hack, no sistema que permite ao usuário adentrar a raiz do equipamento, tendo acesso a todos os arquivos do iOS. Em termos práticos, isso significa poder personalizar e instalar apps livremente, sem depender da loja oficial da Apple.

# Porque devo me preocupar com isso?

Uma aplicação sendo executada em um dispositivo com os privilégios do usuário root ou jail broken acessíveis pode ter seu fluxo de execução modificado por outro processo sendo executado no mesmo dispositivo.

Um usuário malicioso pode monitorar as suas requisições, extrair dados salvos no storage do dispositivo, entre outras ações.

Mas bora resolver isso!
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fd3sc4gutyz8u2xjyt5x.jpeg)

# O que faz o [jail-monkey](https://github.com/GantMan/jail-monkey/)?

* Identifica se o telefone tem acesso a root ou jail-broken.
* Detecta se o dispositivo possui localização mockada ( Eu sei que você usou isso no jogo Pokemon GO 😏).
* Detecta se o aplicativo está rodando em um SD Card.


Chega de blá blá blá e bora colocar a mão no código.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p4opmon5o8mq4qomyca3.jpeg)


**Vamos iniciar um projeto utilizando o React Native CLI.**


# 
```bash
 react-native init myApp
 ou
 npx react-native init myApp
```

**Vamos rodar nossa aplicação em um emulador**


#
```bash
// para executar em um dispositivo android
yarn android

// para ios
yarn ios
```

Se deu tudo certo no processo de build, você verá algo como:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sqpgr6gd1pxghzuuap0g.png)


Até agora, nós criamos nosso app e conseguimos rodar ele no nosso dispositivo/ emulador.

Se você fechar o aplicativo e clicar no ícone na tela inicial do dispositivo, você verá que o projeto vai startar normalmente.

Agora vamos adicionar a biblioteca do Jail-monkey no projeto.

```bash
// para instalar usando npm
npm i jail-monkey --save

// usando yarn
yarn add jail-monkey
```

Feito isso, vamos linkar a biblioteca no nosso projeto.

*OBS: Você só precisa rodar este comando caso esteja utilizando uma versão do react native < 0.60.0*

```bash
react-native link 
```

Em seguida, faça um novo build do seu projeto.

```bash
yarn android
ou
yarn ios 
```

Beleza, agora nós temos tudo instalado no projeto.


Vamos configurar a biblioteca agora no nosso aplicativo, para isso, vá até o seu arquivo principal do seu projeto ( no nosso caso é o App.js da raiz do projeto ) e adicione o seguinte código.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kn0scmg2m3hi66okww63.png)

Vamos ver o que fizermos:

1. importamos o BackHandler do próprio React Native para usarmos a função ExitApp.
2. importamos a biblioteca do jail-monkey
3. criamos uma condição utilizando uma função que retorna se o dispositivo possui root/ jail-broken e fechamos a aplicação.

Ps: No passo 3, você poderia simplesmente criar um modal bonitinho explicando que o usuário não possui a segurança necessária para utilizar a nossa aplicação, fica com uma usabilidade bem melhor ☺️.

Depois de tudo isso, se você salvar o código, fechar o app e tentar abrir em um emulador android, automaticamente a sua aplicação fechará, isto é por conta do emulador android possuir root nativamente, mas se você testar em um dispositivo fisico, a sua aplicação irá funcionar normalmente.


Além do exemplo que criamos acima, você pode explorar um pouco dos recursos do jail-monkey e adicionar de acordo com a sua necessidade.


# Alguns metodos da API do Jail-monkey

Method | Returns | Description
---|---|---
`isJailBroken` | `boolean` | is this device jail-broken/rooted.
`canMockLocation` | `boolean` | Can this device fake its GPS location.
`trustFall` | `boolean` | Checks if the device violates either `isJailBroken` or `canMockLocation`.
`isDebuggedMode` | `Promise<boolean>` | Is the application is running in debug mode. Note that this method returns a Promise.


Bom, por hoje é isso, espero que ajude vocês a melhorar a segurança dos aplicativos em React Native. 

Valeu