{"id":1314,"date":"2026-11-11T12:30:00","date_gmt":"2026-11-11T11:30:00","guid":{"rendered":"https:\/\/remivernier.com\/?p=1314"},"modified":"2026-11-11T12:30:00","modified_gmt":"2026-11-11T11:30:00","slug":"entra-id-flux-device-code-detournement","status":"publish","type":"post","link":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/","title":{"rendered":"Entra ID: le flux device code et son d\u00e9tournement"},"content":{"rendered":"<p>Un utilisateur peut-il donner \u00e0 un attaquant l&rsquo;acc\u00e8s \u00e0 sa bo\u00eete aux lettres sans jamais saisir son mot de passe ailleurs que sur une vraie page Microsoft, MFA comprise? Oui. Il lui suffit de taper sur microsoft.com\/devicelogin un code \u00e0 9 caract\u00e8res que l&rsquo;attaquant lui a envoy\u00e9. Le flux OAuth 2.0 device authorization grant fait ensuite le reste, et c&rsquo;est le poste de l&rsquo;attaquant qui re\u00e7oit les jetons.<\/p>\n<p>Le m\u00e9canisme est connu depuis longtemps, mais il revient r\u00e9guli\u00e8rement dans des campagnes r\u00e9elles, et la parade principale se r\u00e8gle dans l&rsquo;acc\u00e8s conditionnel. Sur ce sujet j&rsquo;ai voulu \u00eatre exhaustif et descendre dans le d\u00e9tail: les \u00e9changes eux-m\u00eames, ce que l&rsquo;attaquant en tire, ce que les journaux montrent et la mani\u00e8re de fermer la porte.<\/p>\n<h2>Device code flow?<\/h2>\n<p>Le flux est normalis\u00e9 par la <a href=\"https:\/\/oauth.net\/2\/device-flow\/\">RFC 8628, OAuth 2.0 Device Authorization Grant<\/a>. Il a \u00e9t\u00e9 pens\u00e9 pour les appareils qui n&rsquo;ont pas de navigateur ou qui ont un clavier tr\u00e8s limit\u00e9: t\u00e9l\u00e9vision connect\u00e9e, outil en ligne de commande, salle de r\u00e9union Teams, etc\u2026 L&rsquo;appareil ne fait pas d&rsquo;authentification lui-m\u00eame. Il demande un code au serveur d&rsquo;autorisation, l&rsquo;affiche, et l&rsquo;utilisateur va s&rsquo;authentifier sur un autre appareil, en g\u00e9n\u00e9ral son PC ou son t\u00e9l\u00e9phone.<\/p>\n<p>Contrairement au flux authorization code, il n&rsquo;y a ni redirect_uri ni navigateur entre l&rsquo;appareil et le serveur d&rsquo;autorisation. Le seul lien entre la session de l&rsquo;utilisateur et l&rsquo;appareil qui recevra les jetons est le user_code. Toute la question de s\u00e9curit\u00e9 vient de l\u00e0: rien dans le protocole ne garantit que l&rsquo;appareil qui a demand\u00e9 le code se trouve physiquement \u00e0 c\u00f4t\u00e9 de la personne qui le saisit.<\/p>\n<p>La RFC d\u00e9crit elle-m\u00eame ce sc\u00e9nario dans sa section 5.4 \u00ab Remote Phishing \u00bb.<\/p>\n<h2>Les \u00e9changes \/devicecode et \/token<\/h2>\n<p>Pour suivre les \u00e9changes, nous utilisons une petite maquette:<\/p>\n<ul>\n<li>Tenant de test: test.onmicrosoft.com (identifiant rang\u00e9 dans la variable TENANT)<\/li>\n<li>Application inscrite: app-devicecode-test, avec le param\u00e8tre \u00ab Allow public client flows \u00bb \u00e0 \u00ab Yes \u00bb dans l&rsquo;onglet \u00ab Authentication \u00bb (sans ce param\u00e8tre une application que nous avons inscrite nous-m\u00eames ne peut pas utiliser le flux)<\/li>\n<li>Utilisateur: alice@test.onmicrosoft.com, soumise \u00e0 la MFA<\/li>\n<li>Poste client: srv01, sur lequel nous lan\u00e7ons les requ\u00eates avec curl<\/li>\n<\/ul>\n<h3>Demande du code<\/h3>\n<p>Le client envoie une requ\u00eate POST au point de terminaison <code>\/devicecode<\/code>, sans aucun secret: c&rsquo;est un client public. La <a href=\"https:\/\/docs.azure.cn\/en-us\/entra\/identity-platform\/v2-oauth2-device-code\">documentation Microsoft du flux<\/a> d\u00e9crit les trois param\u00e8tres: le tenant dans l&rsquo;URL, le client_id et les scopes demand\u00e9s.<\/p>\n<pre class=\"wp-block-code\"><code>curl -s -X POST \"https:\/\/login.microsoftonline.com\/$TENANT\/oauth2\/v2.0\/devicecode\" \\\n  -d \"client_id=$CLIENT_ID\" \\\n  --data-urlencode \"scope=openid profile offline_access User.Read\"<\/code><\/pre>\n<p>Nous obtenons une r\u00e9ponse de ce type:<\/p>\n<pre class=\"wp-block-code\"><code>{\n  \"user_code\": \"F7KQ2N8XM\",\n  \"device_code\": \"DAQABIQEAAABVrSpeuWamRam2jAF1XRQE...\",\n  \"verification_uri\": \"https:\/\/microsoft.com\/devicelogin\",\n  \"expires_in\": 900,\n  \"interval\": 5,\n  \"message\": \"To sign in, use a web browser to open the page https:\/\/microsoft.com\/devicelogin and enter the code F7KQ2N8XM to authenticate.\"\n}<\/code><\/pre>\n<p>-> <code>device_code<\/code>: la valeur longue et opaque, qui reste sur le poste qui a fait la demande. C&rsquo;est elle qui permettra de r\u00e9cup\u00e9rer les jetons.<\/p>\n<p>-> <code>expires_in<\/code> et <code>interval<\/code>: la dur\u00e9e de validit\u00e9 du couple de codes (ici 15 minutes) et le d\u00e9lai minimal entre deux interrogations du point \/token.<\/p>\n<p>Le scope <code>offline_access<\/code> fait d\u00e9livrer un refresh token en plus de l&rsquo;access token: entre les mains d&rsquo;un attaquant, c&rsquo;est lui qui transforme quinze minutes de fen\u00eatre en acc\u00e8s durable.<\/p>\n<h3>Interrogation du point \/token<\/h3>\n<p>Pendant que l&rsquo;utilisateur s&rsquo;authentifie, le client interroge le point <code>\/token<\/code> toutes les <code>interval<\/code> secondes avec le grant type propre au flux:<\/p>\n<pre class=\"wp-block-code\"><code>curl -s -X POST \"https:\/\/login.microsoftonline.com\/$TENANT\/oauth2\/v2.0\/token\" \\\n  -d \"grant_type=urn:ietf:params:oauth:grant-type:device_code\" \\\n  -d \"client_id=$CLIENT_ID\" \\\n  -d \"device_code=$DEVICE_CODE\"<\/code><\/pre>\n<p>Tant qu&rsquo;Alice n&rsquo;a rien saisi, la r\u00e9ponse est une erreur <code>authorization_pending<\/code>.<\/p>\n<p>C\u00f4t\u00e9 Alice, sur son PC, la s\u00e9quence est la suivante:<\/p>\n<ol>\n<li>Elle ouvre https:\/\/microsoft.com\/devicelogin et saisit F7KQ2N8XM.<\/li>\n<li>Elle choisit son compte, saisit son mot de passe et valide la MFA, comme pour n&rsquo;importe quelle connexion.<\/li>\n<li>Entra ID lui affiche le nom de l&rsquo;application et lui demande de confirmer qu&rsquo;elle essaie bien de s&rsquo;y connecter.<\/li>\n<\/ol>\n<p>\u00c0 l&rsquo;interrogation suivante, srv01 re\u00e7oit enfin un JSON contenant <code>access_token<\/code>, <code>id_token<\/code> et <code>refresh_token<\/code>. Ces jetons n&rsquo;ont jamais transit\u00e9 par le navigateur d&rsquo;Alice: ils sont remis \u00e0 celui qui d\u00e9tient le device_code.<\/p>\n<figure class=\"wp-block-image\">\n<svg viewBox=\"0 0 720 360\" width=\"100%\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" font-family=\"sans-serif\" font-size=\"13\">\n<defs><marker id=\"fl\" markerWidth=\"10\" markerHeight=\"10\" refX=\"9\" refY=\"3\" orient=\"auto\"><path d=\"M0,0 L9,3 L0,6 z\" fill=\"#333\"\/><\/marker><\/defs>\n<rect x=\"20\" y=\"20\" width=\"170\" height=\"50\" fill=\"#fdf3e1\" stroke=\"#333\"\/>\n<text x=\"105\" y=\"42\" text-anchor=\"middle\" font-size=\"14\">Poste de l&rsquo;attaquant<\/text>\n<text x=\"105\" y=\"60\" text-anchor=\"middle\">d\u00e9tient le device_code<\/text>\n<rect x=\"275\" y=\"20\" width=\"170\" height=\"50\" fill=\"#e8f0fe\" stroke=\"#333\"\/>\n<text x=\"360\" y=\"42\" text-anchor=\"middle\" font-size=\"14\">Entra ID<\/text>\n<text x=\"360\" y=\"60\" text-anchor=\"middle\">\/devicecode et \/token<\/text>\n<rect x=\"530\" y=\"20\" width=\"170\" height=\"50\" fill=\"#e6f4ea\" stroke=\"#333\"\/>\n<text x=\"615\" y=\"42\" text-anchor=\"middle\" font-size=\"14\">Navigateur de la victime<\/text>\n<text x=\"615\" y=\"60\" text-anchor=\"middle\">microsoft.com\/devicelogin<\/text>\n<line x1=\"105\" y1=\"70\" x2=\"105\" y2=\"345\" stroke=\"#333\" stroke-dasharray=\"4 4\"\/>\n<line x1=\"360\" y1=\"70\" x2=\"360\" y2=\"345\" stroke=\"#333\" stroke-dasharray=\"4 4\"\/>\n<line x1=\"615\" y1=\"70\" x2=\"615\" y2=\"345\" stroke=\"#333\" stroke-dasharray=\"4 4\"\/>\n<line x1=\"105\" y1=\"100\" x2=\"355\" y2=\"100\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"230\" y=\"94\" text-anchor=\"middle\">1. POST \/devicecode<\/text>\n<line x1=\"360\" y1=\"130\" x2=\"110\" y2=\"130\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"230\" y=\"124\" text-anchor=\"middle\">2. device_code + user_code<\/text>\n<line x1=\"105\" y1=\"165\" x2=\"610\" y2=\"165\" stroke=\"#333\" stroke-dasharray=\"6 3\" marker-end=\"url(#fl)\"\/>\n<text x=\"360\" y=\"159\" text-anchor=\"middle\">3. user_code envoy\u00e9 par courriel, Teams, SMS&#8230;<\/text>\n<line x1=\"615\" y1=\"200\" x2=\"365\" y2=\"200\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"490\" y=\"194\" text-anchor=\"middle\">4. code + mot de passe + MFA<\/text>\n<line x1=\"105\" y1=\"240\" x2=\"355\" y2=\"240\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"230\" y=\"234\" text-anchor=\"middle\">5. POST \/token (polling)<\/text>\n<line x1=\"360\" y1=\"280\" x2=\"110\" y2=\"280\" stroke=\"#333\" marker-end=\"url(#fl)\"\/>\n<text x=\"230\" y=\"274\" text-anchor=\"middle\">6. access + refresh token<\/text>\n<text x=\"490\" y=\"300\" text-anchor=\"middle\">la victime ne voit<\/text>\n<text x=\"490\" y=\"318\" text-anchor=\"middle\">aucun jeton<\/text>\n<\/svg><figcaption>Flux device code d\u00e9tourn\u00e9: le code est demand\u00e9 par un poste, valid\u00e9 depuis un autre.<\/figcaption><\/figure>\n<h2>Le code de l&rsquo;attaquant<\/h2>\n<p>Dans un d\u00e9tournement, l&rsquo;attaquant tient le r\u00f4le de la t\u00e9l\u00e9vision. Il lance le flux depuis sa machine, garde le device_code et fait parvenir le user_code \u00e0 sa cible avec un pr\u00e9texte: invitation \u00e0 une r\u00e9union Teams, document partag\u00e9, demande de \u00ab v\u00e9rification de compte \u00bb, etc\u2026 La victime arrive sur une page r\u00e9ellement h\u00e9berg\u00e9e par Microsoft, sous un nom de domaine Microsoft, avec le certificat attendu. V\u00e9rifier l&rsquo;URL ne sert donc \u00e0 rien, comme le montre <a href=\"https:\/\/securelist.com\/microsoft-device-code-phishing-attack\/120350\/\">l&rsquo;analyse de Kaspersky sur une campagne<\/a>.<\/p>\n<p>La MFA est bel et bien valid\u00e9e, par la victime elle-m\u00eame, sur son propre appareil. Le jeton \u00e9mis porte donc la mention d&rsquo;une authentification forte, et l&rsquo;acc\u00e8s conditionnel \u00e9valu\u00e9 au moment de la connexion voit l&rsquo;adresse IP et l&rsquo;appareil de la victime, pas ceux de l&rsquo;attaquant.<\/p>\n<p>Le d\u00e9lai d&rsquo;expiration de 15 minutes g\u00eane peu l&rsquo;attaquant: il g\u00e9n\u00e8re le code au dernier moment, quand la cible ouvre le message ou rejoint l&rsquo;\u00e9change.<\/p>\n<p>Microsoft a document\u00e9 une campagne de ce type en f\u00e9vrier 2025, attribu\u00e9e \u00e0 <a href=\"https:\/\/www.microsoft.com\/en-us\/security\/blog\/2025\/02\/13\/storm-2372-conducts-device-code-phishing-campaign\/\">Storm-2372<\/a>, active depuis ao\u00fbt 2024. Les invitations Teams factices y menaient la victime au flux device code, puis l&rsquo;attaquant utilisait Microsoft Graph pour fouiller les messages du compte compromis. Dans une mise \u00e0 jour du lendemain, Microsoft signale que l&rsquo;acteur est pass\u00e9 au client_id de Microsoft Authentication Broker dans le flux.<\/p>\n<p>Ce dernier point a beaucoup d&rsquo;importance. Avec un client de premi\u00e8re partie, l&rsquo;attaquant n&rsquo;a besoin d&rsquo;aucune inscription d&rsquo;application dans le tenant de la victime ni d&rsquo;aucun consentement administrateur: le param\u00e8tre \u00ab Allow public client flows \u00bb de nos propres applications ne le concerne pas. Avec le broker, le refresh token obtenu peut en plus servir \u00e0 inscrire un appareil contr\u00f4l\u00e9 par l&rsquo;attaquant dans Entra ID, et c&rsquo;est la porte vers un Primary Refresh Token, dont nous avions d\u00e9taill\u00e9 la structure dans l&rsquo;article <a href=\"https:\/\/remivernier.com\/index.php\/2026\/10\/28\/anatomie-primary-refresh-token-entra-id\/\">Anatomie du Primary Refresh Token Entra ID<\/a>. On ne parle plus alors d&rsquo;un jeton applicatif vol\u00e9 mais d&rsquo;une identit\u00e9 d&rsquo;appareil install\u00e9e dans le tenant.<\/p>\n<p>Le rayon d&rsquo;impact d\u00e9pend donc surtout des scopes et du client utilis\u00e9:<\/p>\n<ul>\n<li>l&rsquo;access token donne environ une heure d&rsquo;acc\u00e8s aux ressources demand\u00e9es (Exchange Online, SharePoint, Graph\u2026);<\/li>\n<li>le refresh token, valable 90 jours par d\u00e9faut et renouvel\u00e9 \u00e0 chaque usage, permet d&rsquo;obtenir de nouveaux access tokens, y compris pour d&rsquo;autres ressources quand le client le permet;<\/li>\n<li>depuis une bo\u00eete aux lettres compromise, l&rsquo;attaquant peut relancer le m\u00eame sc\u00e9nario vers les contacts internes, avec un message qui vient cette fois d&rsquo;un coll\u00e8gue.<\/li>\n<\/ul>\n<p>Le rejeu du refresh token et sa r\u00e9vocation font l&rsquo;objet de l&rsquo;article <a href=\"https:\/\/remivernier.com\/index.php\/2026\/11\/09\/entra-id-refresh-token-rejeu-revocation\/\">Entra ID: refresh token, rejeu et r\u00e9vocation<\/a>.<\/p>\n<h2>Ce que l&rsquo;on voit dans les journaux<\/h2>\n<p>Dans les journaux de connexion Entra ID, la connexion interactive de la victime porte la propri\u00e9t\u00e9 \u00ab Authentication protocol \u00bb \u00e9gale \u00e0 \u00ab Device code flow \u00bb. Microsoft documente aussi une seconde propri\u00e9t\u00e9, \u00ab Original transfer method \u00bb, visible dans \u00ab Basic info \u00bb: elle indique qu&rsquo;une session a \u00e9t\u00e9 ouverte par device code m\u00eame quand l&rsquo;\u00e9v\u00e9nement courant, par exemple un rafra\u00eechissement de jeton, ne le montre plus. Entra ID appelle ce suivi le <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/conditional-access\/concept-authentication-transfer\">protocol tracking<\/a>.<\/p>\n<p>Attention: l&rsquo;adresse IP de la connexion interactive est celle de la victime, puisque c&rsquo;est elle qui s&rsquo;authentifie. L&rsquo;adresse de l&rsquo;attaquant n&rsquo;appara\u00eet qu&rsquo;ensuite, dans les connexions non interactives o\u00f9 le refresh token est utilis\u00e9. Un rejeu ressemble beaucoup \u00e0 une application qui renouvelle ses jetons en t\u00e2che de fond, et c&rsquo;est ce qui rend la d\u00e9tection difficile.<\/p>\n<p>Si les journaux sont envoy\u00e9s dans Log Analytics ou Sentinel, nous pouvons commencer par inventorier l&rsquo;usage du flux:<\/p>\n<pre class=\"wp-block-code\"><code>SigninLogs\n| where TimeGenerated &gt; ago(30d)\n| where AuthenticationProtocol == \"deviceCode\"\n| project TimeGenerated, UserPrincipalName, AppDisplayName, AppId,\n          IPAddress, UserAgent, ResultType, CorrelationId\n| order by TimeGenerated desc<\/code><\/pre>\n<p>Sur la maquette, nous voyons appara\u00eetre la connexion d&rsquo;Alice vers app-devicecode-test, avec le user agent de son navigateur. Pour un tenant de production, plusieurs signaux m\u00e9ritent une corr\u00e9lation:<\/p>\n<ul>\n<li>un utilisateur qui n&rsquo;a jamais utilis\u00e9 le flux et qui l&rsquo;utilise soudain, surtout vers un client de premi\u00e8re partie (Azure CLI, Microsoft Authentication Broker, Office\u2026) qui ne correspond pas \u00e0 son m\u00e9tier;<\/li>\n<li>dans <code>AADNonInteractiveUserSignInLogs<\/code>, des connexions du m\u00eame utilisateur et de la m\u00eame application depuis une adresse IP ou un pays diff\u00e9rent de la connexion interactive, peu apr\u00e8s celle-ci;<\/li>\n<li>des user agents tr\u00e8s diff\u00e9rents dans la m\u00eame session: le navigateur de la victime d&rsquo;un c\u00f4t\u00e9, un script de l&rsquo;autre. <a href=\"https:\/\/www.elastic.co\/guide\/en\/security\/8.19\/entra-id-oauth-device-code-flow-with-concurrent-sign-ins.html\">Une r\u00e8gle de d\u00e9tection Elastic<\/a> s&rsquo;appuie sur ce signal;<\/li>\n<li>dans les journaux d&rsquo;audit, l&rsquo;inscription d&rsquo;un nouvel appareil pour cet utilisateur juste apr\u00e8s la connexion;<\/li>\n<\/ul>\n<p>Quand la compromission est confirm\u00e9e, changer le mot de passe ne suffit pas: les refresh tokens d\u00e9j\u00e0 \u00e9mis doivent \u00eatre r\u00e9voqu\u00e9s. Microsoft recommande d&rsquo;appeler <code>revokeSignInSessions<\/code>:<\/p>\n<pre class=\"wp-block-code\"><code>Connect-MgGraph -Scopes \"User.RevokeSessions.All\"\nRevoke-MgUserSignInSession -UserId \"alice@test.onmicrosoft.com\"<\/code><\/pre>\n<p>Attention, il faut aussi supprimer tout appareil inscrit par l&rsquo;attaquant, sinon son identit\u00e9 d&rsquo;appareil survit \u00e0 la r\u00e9vocation.<\/p>\n<h2>Bloquer le flux avec l&rsquo;acc\u00e8s conditionnel<\/h2>\n<p>La position de Microsoft est claire dans la page <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/conditional-access\/policy-block-authentication-flows\">Block authentication flows with Conditional Access policy<\/a>: s&rsquo;approcher le plus possible d&rsquo;un blocage total du device code flow, et ne le garder que pour des cas document\u00e9s et s\u00e9curis\u00e9s, comme un outil ancien que l&rsquo;on ne peut pas faire \u00e9voluer.<\/p>\n<p>La condition \u00e0 utiliser s&rsquo;appelle \u00ab Authentication flows \u00bb. Elle propose deux valeurs: \u00ab Device code flow \u00bb et \u00ab Authentication transfer \u00bb (le passage d&rsquo;une session du PC vers le mobile par QR code, en pr\u00e9version \u00e0 l&rsquo;heure o\u00f9 j&rsquo;\u00e9cris ces lignes). La strat\u00e9gie se construit ainsi:<\/p>\n<ol>\n<li>Dans le centre d&rsquo;administration Entra, \u00ab Entra ID \u00bb puis \u00ab Conditional Access \u00bb puis \u00ab Policies \u00bb, \u00ab New policy \u00bb.<\/li>\n<li>\u00ab Users \u00bb: tous les utilisateurs, en excluant les comptes de secours (break glass) et, si besoin, un groupe d&rsquo;exception explicite.<\/li>\n<li>\u00ab Conditions \u00bb, \u00ab Authentication flows \u00bb: \u00ab Configure \u00bb \u00e0 \u00ab Yes \u00bb, puis cocher \u00ab Device code flow \u00bb.<\/li>\n<li>\u00ab Grant \u00bb: \u00ab Block access \u00bb.<\/li>\n<li>Activer d&rsquo;abord la strat\u00e9gie en \u00ab Report-only \u00bb.<\/li>\n<\/ol>\n<p>Le mode \u00ab Report-only \u00bb sert \u00e0 v\u00e9rifier qui utilise encore le flux, en croisant avec la requ\u00eate KQL vue plus haut. Les cas l\u00e9gitimes que l&rsquo;on retrouve le plus souvent sont les salles et appareils Teams, certains outils en ligne de commande et des scripts d&rsquo;administration. Pour les appareils Teams, Microsoft documente une <a href=\"https:\/\/learn.microsoft.com\/en-us\/entra\/identity\/conditional-access\/policy-teams-devices-device-code-flow\">variante de la strat\u00e9gie<\/a> qui exclut les groupes de comptes de ressources concern\u00e9s ainsi que la ressource Device Registration Service.<\/p>\n<p>Attention: la liste d&rsquo;exclusion devient elle-m\u00eame une cible. Un compte exclu peut toujours \u00eatre hame\u00e7onn\u00e9 par ce flux. Il faut la garder courte, la r\u00e9viser r\u00e9guli\u00e8rement et, si possible, limiter les exceptions \u00e0 des emplacements nomm\u00e9s.<\/p>\n<p>Gr\u00e2ce au protocol tracking, les rafra\u00eechissements d&rsquo;une session ouverte par device code sont aussi \u00e9valu\u00e9s par la strat\u00e9gie. L&rsquo;outil \u00ab What If \u00bb de l&rsquo;acc\u00e8s conditionnel accepte la condition \u00ab Device code flow \u00bb pour tester avant de passer en mode \u00ab On \u00bb.<\/p>\n<p>Pour les scripts qui utilisaient ce flux, la sortie se fait en g\u00e9n\u00e9ral vers une identit\u00e9 manag\u00e9e ou un principal de service avec certificat. Pour les utilisateurs, la consigne de sensibilisation tient en une phrase: ne jamais saisir sur microsoft.com\/devicelogin un code que l&rsquo;on n&rsquo;a pas fait afficher soi-m\u00eame, sur un appareil que l&rsquo;on a devant soi.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Flux device code dans Entra ID: requ\u00eates \/devicecode et \/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l&rsquo;acc\u00e8s conditionnel.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20,3,37],"tags":[141,154,80,156,157,138,137,155],"class_list":["post-1314","post","type-post","status-publish","format-standard","hentry","category-azure-ad","category-protocoles","category-securite","tag-acces-conditionnel","tag-device-code","tag-entra-id","tag-hameconnage","tag-journaux-de-connexion","tag-oauth-2-0","tag-refresh-token","tag-rfc-8628"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Entra ID: le flux device code et son d\u00e9tournement - R\u00e9mi VERNIER<\/title>\n<meta name=\"description\" content=\"Flux device code dans Entra ID: requ\u00eates \/devicecode et \/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l&#039;acc\u00e8s conditionnel.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Entra ID: le flux device code et son d\u00e9tournement - R\u00e9mi VERNIER\" \/>\n<meta property=\"og:description\" content=\"Flux device code dans Entra ID: requ\u00eates \/devicecode et \/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l&#039;acc\u00e8s conditionnel.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/\" \/>\n<meta property=\"og:site_name\" content=\"R\u00e9mi VERNIER\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-11T11:30:00+00:00\" \/>\n<meta name=\"author\" content=\"R\u00e9mi\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"R\u00e9mi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/\"},\"author\":{\"name\":\"R\u00e9mi\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"headline\":\"Entra ID: le flux device code et son d\u00e9tournement\",\"datePublished\":\"2026-11-11T11:30:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/\"},\"wordCount\":2006,\"commentCount\":0,\"keywords\":[\"acces conditionnel\",\"device code\",\"entra id\",\"hame\u00e7onnage\",\"journaux de connexion\",\"oauth 2.0\",\"refresh token\",\"rfc 8628\"],\"articleSection\":[\"Azure AD\",\"Protocoles\",\"S\u00e9curit\u00e9\"],\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/\",\"url\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/\",\"name\":\"Entra ID: le flux device code et son d\u00e9tournement - R\u00e9mi VERNIER\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\"},\"datePublished\":\"2026-11-11T11:30:00+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\"},\"description\":\"Flux device code dans Entra ID: requ\u00eates \\\/devicecode et \\\/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l'acc\u00e8s conditionnel.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/index.php\\\/2026\\\/11\\\/11\\\/entra-id-flux-device-code-detournement\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/remivernier.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Entra ID: le flux device code et son d\u00e9tournement\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#website\",\"url\":\"https:\\\/\\\/remivernier.com\\\/\",\"name\":\"R\u00e9mi VERNIER\",\"description\":\"Identit\u00e9, s\u00e9curit\u00e9, SAP et IA : Active Directory, Azure &amp; co...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/remivernier.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/remivernier.com\\\/#\\\/schema\\\/person\\\/a4c76c63a5a3d94454484845e42fc906\",\"name\":\"R\u00e9mi\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g\",\"caption\":\"R\u00e9mi\"},\"sameAs\":[\"http:\\\/\\\/www.linkedin.com\\\/in\\\/remi-vernier\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Entra ID: le flux device code et son d\u00e9tournement - R\u00e9mi VERNIER","description":"Flux device code dans Entra ID: requ\u00eates \/devicecode et \/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l'acc\u00e8s conditionnel.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/","og_locale":"fr_FR","og_type":"article","og_title":"Entra ID: le flux device code et son d\u00e9tournement - R\u00e9mi VERNIER","og_description":"Flux device code dans Entra ID: requ\u00eates \/devicecode et \/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l'acc\u00e8s conditionnel.","og_url":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/","og_site_name":"R\u00e9mi VERNIER","article_published_time":"2026-11-11T11:30:00+00:00","author":"R\u00e9mi","twitter_card":"summary_large_image","twitter_misc":{"\u00c9crit par":"R\u00e9mi","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/#article","isPartOf":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/"},"author":{"name":"R\u00e9mi","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"headline":"Entra ID: le flux device code et son d\u00e9tournement","datePublished":"2026-11-11T11:30:00+00:00","mainEntityOfPage":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/"},"wordCount":2006,"commentCount":0,"keywords":["acces conditionnel","device code","entra id","hame\u00e7onnage","journaux de connexion","oauth 2.0","refresh token","rfc 8628"],"articleSection":["Azure AD","Protocoles","S\u00e9curit\u00e9"],"inLanguage":"fr-FR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/","url":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/","name":"Entra ID: le flux device code et son d\u00e9tournement - R\u00e9mi VERNIER","isPartOf":{"@id":"https:\/\/remivernier.com\/#website"},"datePublished":"2026-11-11T11:30:00+00:00","author":{"@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906"},"description":"Flux device code dans Entra ID: requ\u00eates \/devicecode et \/token, hame\u00e7onnage par code, traces dans les journaux et blocage par l'acc\u00e8s conditionnel.","breadcrumb":{"@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/remivernier.com\/index.php\/2026\/11\/11\/entra-id-flux-device-code-detournement\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/remivernier.com\/"},{"@type":"ListItem","position":2,"name":"Entra ID: le flux device code et son d\u00e9tournement"}]},{"@type":"WebSite","@id":"https:\/\/remivernier.com\/#website","url":"https:\/\/remivernier.com\/","name":"R\u00e9mi VERNIER","description":"Identit\u00e9, s\u00e9curit\u00e9, SAP et IA : Active Directory, Azure &amp; co...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/remivernier.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"https:\/\/remivernier.com\/#\/schema\/person\/a4c76c63a5a3d94454484845e42fc906","name":"R\u00e9mi","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f750448bc07f5d1d9c1189344283777ec0d33275c184599b199fb6b305bc6fba?s=96&d=mm&r=g","caption":"R\u00e9mi"},"sameAs":["http:\/\/www.linkedin.com\/in\/remi-vernier"]}]}},"_links":{"self":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1314","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/comments?post=1314"}],"version-history":[{"count":1,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1314\/revisions"}],"predecessor-version":[{"id":1318,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/posts\/1314\/revisions\/1318"}],"wp:attachment":[{"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/remivernier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}