{"id":1273,"date":"2021-09-30T23:15:53","date_gmt":"2021-09-30T23:15:53","guid":{"rendered":"https:\/\/fluentreports.com\/blog\/?p=1273"},"modified":"2021-09-30T23:23:32","modified_gmt":"2021-09-30T23:23:32","slug":"another-pointless-nativescript-security-plugin","status":"publish","type":"post","link":"https:\/\/fluentreports.com\/blog\/?p=1273","title":{"rendered":"Another pointless NativeScript Security Plugin...."},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">So, I saw this blog (<a href=\"https:\/\/blog.nativescript.org\/nativescript-ios-security\/index.html\">https:\/\/blog.nativescript.org\/nativescript-ios-security\/index.html<\/a>) article today, and was thinking awesome someone is actually talking about security in NativeScript apps...   My elation was very short lived.   Shortly, after starting to read it, I'm like, oh my G*D!     <strong>Bad security<\/strong> <strong>advice is way worse than no security advice!<\/strong>      At least the other insecure plugin <a href=\"https:\/\/plugins.nativescript.rocks\/plugin\/@nativescript\/secure-storage\">NativeScript\/Secure-Storage<\/a> has a point, this one....     <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Well, if you read any of my prior posts on the in-security of React Native, NativeScript, Ionic <a href=\"https:\/\/fluentreports.com\/blog\/?p=1234\" data-type=\"post\" data-id=\"1234\">here<\/a>, and <a href=\"https:\/\/fluentreports.com\/blog\/?p=688\" data-type=\"post\" data-id=\"688\">here<\/a>.   You might have guessed what my response to this is...<\/p>\n\n\n\n<blockquote class=\"wp-block-quote has-text-align-center is-layout-flow wp-block-quote-is-layout-flow\"><p><strong>Lets show how trivial this is to bypass...<\/strong><\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Creating the Demo Applications<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">First, lets create a throw away folder, and two simple test apps.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mkdir bypass\nchdir bypass\nns create demoapp --js\nns create shellbypass --js\ncd shellbypass\nns plugin add @nativescript\/ios-security\ncd ..\/demoapp\nns plugin add @nativescript\/ios-security<meta http-equiv=\"content-type\" content=\"text\/html; charset=utf-8\"><\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a Demo to test it...<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>demoapp<\/strong> is our awesome multi-year released app that we have poured hundreds of hours and millions of dollars in.   The <strong>shellbypass<\/strong> is the hackers app.<\/p>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Open your favorite editor...   Mine is phpStorm and it should look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-12.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-12-638x1024.png\" alt=\"\" class=\"wp-image-1274\" width=\"260\" height=\"417\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-12-638x1024.png 638w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-12-187x300.png 187w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-12-624x1001.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-12.png 688w\" sizes=\"auto, (max-width: 260px) 100vw, 260px\" \/><\/a><\/figure>\n<\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Next you need to open the <code><strong>demoapp\/app\/main-page.js<\/strong> file<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then at the top we want to add this <em>awesome<\/em> plugin so add: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const IOSSecurity = <strong><em>require<\/em><\/strong>(\"@nativescript\/ios-security\").IOSSecurity;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Then in right below the page.bindingContext = ... we need to add our security check...<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">let amInEmulator = false;\nif (!<strong><em>global<\/em><\/strong>.<strong><em>android<\/em><\/strong>) {\n  amInEmulator = IOSSecurity.<em>amIRunInEmulator<\/em>();\n}\n\nif (amInEmulator) {\n    console.log(\"Hey I'm in a emulator\");\n    page.bindingContext.set('message', \"I'm in a Emulator\");\n  } else {\n    console.log(\"Hey, we are on a real device!\");\n    page.bindingContext.set('message', \"I'm on a real device!\");\n}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">So the <strong>main-page.js<\/strong> should look like this (with all comments deleted):  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"749\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13-1024x749.png\" alt=\"\" class=\"wp-image-1275\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13-1024x749.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13-300x220.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13-768x562.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13-624x457.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-13.png 1268w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Ok, lets run this on a simulator.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt; ns run ios<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">And look our security check worked perfectly!<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"231\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14-1024x231.png\" alt=\"\" class=\"wp-image-1276\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14-1024x231.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14-300x68.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14-768x173.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14-1536x347.png 1536w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14-624x141.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-14.png 1746w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You can see on the top it is built for a simulator; and the console.log says: \"Hey I'm in a emulator\".       So we have deployed everything correctly.   Now switching roles to the attacker, this app won't run on an emulator, <strong>or will it?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lets just pretend we uploaded it the app store and then used one of the techniques I outlines in the other blog posts to download your application IPA directly from Apple to my mac (or you can just use a jail broken phone).    The IPA will look something like this:  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"907\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15-1024x907.png\" alt=\"\" class=\"wp-image-1277\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15-1024x907.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15-300x266.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15-768x681.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15-624x553.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-15.png 1422w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Lets go into the \"<strong>app<\/strong>\" sub-folder, as it contains our original NativeScript app code.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"265\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16-1024x265.png\" alt=\"\" class=\"wp-image-1278\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16-1024x265.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16-300x78.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16-768x198.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16-624x161.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-16.png 1424w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">So what do we have here...    I outlined them in the other blog posts but we will dip briefly into it..     First lets copy the bundle.js, runtime.js and vendor.js to our \"shellbypass\" app into a new folder called \"other\".    Now normally I would run some my custom tooling to re-extract the code back out of bundle.js\/vendor.js into all their separate files, so I can easily rebuild the app from virtually the same code that you had.   But in this case I'm lazy and I want you to be able to easily follow along so we are just going to use the raw files from the \"<strong>original<\/strong>\" app..<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>If we are on an actual jail broken phone, we actually don't have to do the \"<strong>Creating a Shell<\/strong>\" step, you can skip all the way down to <strong>\"Removing Security\"<\/strong> as you can edit the files directly on the device...<\/p><\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">Creating a Shell<\/h2>\n\n\n\n<ol class=\"wp-block-list\"><li>Delete everything in app\/ folder except the \"<strong>app.js<\/strong>\" file.   <\/li><\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-18.png\"><img loading=\"lazy\" decoding=\"async\" width=\"484\" height=\"156\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-18.png\" alt=\"\" class=\"wp-image-1280\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-18.png 484w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-18-300x97.png 300w\" sizes=\"auto, (max-width: 484px) 100vw, 484px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">2. make <strong>app.js<\/strong> just have the following line of code to make sure that the IOSSecurity native code is built into the new NS app: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const IOSSecurity = <strong><em>require<\/em><\/strong>(\"@nativescript\/ios-security\").IOSSecurity;<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">3. Edit the <code>webpack.config.js<\/code> and make it look like this:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">const webpack = <strong><em>require<\/em><\/strong>(\"@nativescript\/webpack\");<br>const <strong><em>fs <\/em><\/strong>= <strong><em>require<\/em><\/strong>('fs');<br>const platformInfo = <strong><em>require<\/em><\/strong>(\"@nativescript\/webpack\/dist\/helpers\/platform\");<br><br><strong><em>module<\/em><\/strong>.exports = (env) =&gt; {<br>  webpack.init(env);<br><br>  let output = platformInfo.getAbsoluteDistPath() + \"\/\";<br>  if (<strong><em>fs<\/em><\/strong>.existsSync(output)) {<br>    <strong><em>fs<\/em><\/strong>.rmdirSync(output, {recursive: true});<br>  }<br>  setWait(output);<br><br> return webpack.resolveConfig();<br>};<br><br>function setWait(output) {<br>  if (!<strong><em>fs<\/em><\/strong>.existsSync(output+\"vendor.js\") || !<strong><em>fs<\/em><\/strong>.existsSync(output+\"runtime.js\")) {<br>    setTimeout(() =&gt; { setWait(output); }, 100)<br>    return;<br>  }<br>  <strong><em>fs<\/em><\/strong>.copyFileSync(\".\/other\/bundle.js\", output+\"bundle.js\");<br>  <strong><em>fs<\/em><\/strong>.copyFileSync(\".\/other\/runtime.js\", output+\"runtime.js\");<br>  <strong><em>fs<\/em><\/strong>.copyFileSync(\".\/other\/vendor.js\", output+\"vendor.js\");<br>  <strong><em>console<\/em><\/strong>.log(\"Copied\");<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Again I'm being very lazy, basically we are letting webpack work normally, then copying the original <strong>demoapp<\/strong> files into our hackers <strong>shellbypass<\/strong> app.  <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-style-large is-layout-flow wp-block-quote-is-layout-flow\"><p>In all reality splitting the code back out of the bundle into its separate files makes it a lot easier, but my tooling is not very clean so I'm not ready to release it yet.   But it is trivial if you read my prior blogs to split the files back out and de-minimize them...<\/p><\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">So now we have a shell app that should run the original <strong>demoapp<\/strong> code as is.  Lets test it.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">&gt; ns run ios --no-hmr<\/pre>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"258\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-1024x258.png\" alt=\"\" class=\"wp-image-1281\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-1024x258.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-300x75.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-768x193.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-1536x386.png 1536w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-2048x515.png 2048w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-19-624x157.png 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see this app is called \"<strong>shellbypass<\/strong>\" and it is printing the same \"<em>Hey I'm in a emulator<\/em>\".  <strong> <\/strong><\/p>\n\n\n\n<p class=\"has-text-align-center wp-block-paragraph\"><strong>WooHoo, we have successfully cloned your million dollar app into our own free NativeScript shell.<\/strong>   <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Removing Security<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">All of that just to show you have this plugin doesn't matter...     So first there is two ways to do this...    I'll show you both ways, just to show you how trivial it is to remove these types of check's.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Bundle.js<\/strong> changes:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Search for \"amIRunInEmulator\" -- Look we found it on line 205...  Lets just comment that right out...<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"283\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20-1024x283.png\" alt=\"\" class=\"wp-image-1282\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20-1024x283.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20-300x83.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20-768x212.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20-624x172.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-20.png 1108w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now what happens when I run my app...<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"233\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-1024x233.png\" alt=\"\" class=\"wp-image-1283\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-1024x233.png 1024w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-300x68.png 300w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-768x175.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-1536x349.png 1536w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-2048x465.png 2048w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-21-624x142.png 624w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Now the app prints \"<em>Hey, we are on a real device!<\/em>\"  The awesome plugin's security sure did stop me from running on an emulator, didn't it?   The app you so carefully programmed, and may have even spent years on -- I just simply removed the check and ran it and now I'm playing with it on a simulator or a jail broken device.  <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, the vastly better method is to just change the <strong>vendor.js <\/strong>file, so that I don't have to find every place you put the checks in your code.     (So first undo the comment we just added in the bundle.js, so it is back to \"stock\" <strong>demoapp<\/strong>)   <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vendor.js changes:<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">This is the vastly superior solution, lets look about line 46849, and just return false....<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"1024\" src=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22-1004x1024.png\" alt=\"\" class=\"wp-image-1284\" srcset=\"https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22-1004x1024.png 1004w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22-294x300.png 294w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22-768x784.png 768w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22-624x637.png 624w, https:\/\/fluentreports.com\/blog\/wp-content\/uploads\/2021\/09\/image-22.png 1082w\" sizes=\"auto, (max-width: 1004px) 100vw, 1004px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">All I would do is <strong>return false<\/strong> on basically every single one of these functions in the <strong>IOSSecurity<\/strong> class, and the plugin doesn't do a single thing no matter how many times, nor where you called it inside your application (the bundle.js)....  Defeated in less that 5 minutes...   <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wrapping it all up...<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The problem with security measures like this, is that NativeScript, React Native, Cordova\/PhoneGap, Ionic is they all ship the source code ships inside the app.     It is trivial to extract it out, create a new shell and make the changes to make it my own \"clone\" project or to steal\/corrupt your data by using your endpoints.      If you plan on using something like this plugin you need to use a product like JSScrambler or  <a href=\"https:\/\/AppProtection.net\">https:\/\/AppProtection.net<\/a> (my own product which encrypts the NativeScript source code).    If you just ship the app  using minimization (pointless for security, but useful for  optimization).  Please read the prior blog posts on how easy it is to pull everything out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you are interested in more info on my current NativeScript solution <a href=\"https:\/\/AppProtection.net\">AppProtection<\/a>, or if you want to help fund the vastly superior solution that eventually can work for both React Native and NativeScript with no coding changes in your app; please contact me at <a href=\"mailto:nathan@master.technology\">nathan@master.technology<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>So, I saw this blog (https:\/\/blog.nativescript.org\/nativescript-ios-security\/index.html) article today, and was thinking awesome someone is actually talking about security in NativeScript apps... My elation was very short lived. Shortly, after starting to read it, I'm like, oh my G*D! Bad security advice is way worse than no security advice! At least the other insecure plugin NativeScript\/Secure-Storage&hellip; <a class=\"more-link\" href=\"https:\/\/fluentreports.com\/blog\/?p=1273\">Continue reading <span class=\"screen-reader-text\">Another pointless NativeScript Security Plugin....<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1093,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_crdt_document":"","footnotes":""},"categories":[15,5],"tags":[16,34,21],"class_list":["post-1273","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nativescript","category-security","tag-nativescript","tag-plugins","tag-security","entry"],"_links":{"self":[{"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1273"}],"version-history":[{"count":2,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1273\/revisions"}],"predecessor-version":[{"id":1286,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/1273\/revisions\/1286"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=\/wp\/v2\/media\/1093"}],"wp:attachment":[{"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fluentreports.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}