OAuth da Gitea 2 A chamada de retorno do login reativa uma conta de usuário desativada (`IsActive=false`) quando o usuário se inicia através de uma fonte de autenticação que não emite sinais de atualização (nomeadamente GitHub, e qualquer OIDC/OAuth 2 fonte configurada sem `offline_access`. RP # 38009 adicionado um portão destinado a reativar usuários apenas quando o OAuth 2 auto-sync cron os desativara, usando "o token de atualização armazenado está vazio" como sinal. Esse sinal está errado: para fontes que nunca emitem sinais de atualização, um sinal de atualização vazio é o estado normal de cada usuário, por isso o portão não pode distinguir uma conta com cron desativada de uma conta que um administrador deliberadamente desativada. Na próxima vez que o usuário desativado pelo administrador se inscreve através do provedor, a Gitea define "IsActive=true" e concede uma sessão completa, desfazendo silenciosamente a ação do administrador. Este é o comportamento exato # 38009 foi escrito para prevenir. (`ProhibitLogin`, a proibição dura, é aplicada separadamente e não é afetada.) Não são necessários privilégios especiais além de ser o usuário desativado e poder iniciar sessão através da fonte.
`routers/web/auth/oauth.go` (o `handleOAuth 2 Portão de reativação do registro. ``` go if!u.IsActive { extLogin, hasExt, err:= user_model.GetExternalLogin(ctx, authSource.ID, gothUser.ID) se err!= nul { ctx.ServerError("GetExternalLogin", err); devolver } está desactivadoPorAutoSync:= temExt & & & extLogin.Resssai Token == "" // sinal errado se está desactivadoPorAutoSync { opts.IsActive = opcional.Algumas (verdadeira) // reactiva a conta } `````` A suposição de que ` ReashToken == ""` é produzida apenas pelo cron do sincronismo automático é falsa:.
- O caminho de desativação do cron é inalcançável para fontes sem sinais de atualização. `services/auth/source/oauth 2 /source_sync.go` retorna cedo: `if! provider.ResheshTokenDisponível() { retorna... }`, para que nunca desactive (ou toque os símbolos de) tais usuários. - O símbolo armazenado é exatamente o que o provedor devolveu, sem sintetizar: `services/externalcount/user.go` lojas ` ResheshToken: gothUser. ResheshToken`. Quando o fornecedor não emitir nenhum, este é `""` desde o primeiro login. - GitHub nunca emitirá um token de atualização: `goth` hardcodes `func (p *Provider) RefreshTokenDisponível() bool { retorna falso }` (` providers/github/github.go`). OIDC/OAuth 2 sem `offline_ access` também armazenar `""`. Assim, para uma fonte GitHub (ou sem atualização), ` RefreshToken == ""` é o estado de cada usuário, incluindo um administrador desativado, e o portão os reativa.
### Prova de Conceito. Configuração: - Uma instância de Gitea com uma fonte de autenticação GitHub (Painel de administração -> Fontes de autenticação -> OAuth 2 -> GitHub), ou qualquer autêntica 2 /OIDC fonte configurada sem `offline_access`. - Conta V: um usuário normal que se inscreveu pelo menos uma vez através dessa fonte (existe uma linha `external_login_user` com `refresh_token' vazio). Passos: 1. Como administrador, abra o Painel de Administração -> Usuários -> V e desmarque "Ativado" (`is_active=false`). Confirme os pedidos de V agora rebote para a página de ativação. 2. Como V, entre novamente via "Log in with GitHub" e complete o fluxo do provedor. 3. V se aterrissa no aplicativo com uma sessão de trabalho. `SELECTION is_active DESDE "user" WHERE lower_name='v';` retorna agora `verdadeira`.
Esperado (intencionado por # 38009 ): V permanece `is_active=false` e é direcionado para a página de ativação. Real: V é ` is_active= true` com uma sessão completa — a desativação do administrador está desativada. ``` - GitHub usuário, ADMIN desativado atualizarToken="" -> REACTIVADO + sessão concedida permanece desativado (controle) - usuário da OIDC, Cron AUTO- SYNC desativado atualizarToken=" -> REACTIVADO (intencionado) RESULTADO: BYPASS CONFIRMED. ````.
Teste de regressão da própria Gitea `TestOAuth 2 CallbackReactivationGating` ("Usuário com desativação automática é reativado") define `ReatualizarToken=""` e afirma reativação após uma chamada completa da OIDC — esse estado é idêntico ao de um usuário fonte GitHub, um administrador desativado. Qualquer instância da Gitea usando uma fonte de autenticação GitHub (uma das mais comuns) ou uma OIDC/OAuth 2 a fonte sem os tokens de atualização, que depende da opção "Ativado" para desativar as contas, é afetada. Um usuário desativado restaura sua própria conta para ativar e obtém uma sessão, recuperando qualquer acesso que a conta tivesse. A desativação não elimina `IsAdmin`, por isso um administrador desativado recupera o acesso ao administrador. A ligação: as contas desativadas com "Prohibit Login" permanecem bloqueadas; isso derrota a desativação apenas de `IsActive= false`.
Registro de aconselhamento: GHSA- vrhc-jjfc-m 3 m 3. Identificadores relacionados: CVE- 2026 - 55987. Tempo: GitHub Advisory Database publicou este registro em 2026 - 07 - 21 T 21: 02: 10.000 Z e lista a sua última modificação como 2026 - 07 - 21 T 21: 02: 10.000 Z.
Severidade: ALTAMENTE. Dados de pontuação publicados: CVSS_V 3: CVSS: 3.1 /AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N. Software afetado e informações de versão: Go package code.gitea.io/gitea — ECOSISTEM: introduzido 0, corrigido 1.27.0.
Classificação e evidência: identificadores de fraqueza CWE- 863. O registro contém 3 suporte de referências nestes tipos: WEB, PACKAGE.