Skip to content

Commit 2b0a7f5

Browse files
Merge pull request #89 from jfrog/MAR-10284
MAR-10284 - Research add Real post
2 parents c08a6a0 + b15851d commit 2b0a7f5

27 files changed

+837
-39
lines changed

gridsome.config.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@ module.exports = {
2727
remark: {},
2828
},
2929
},
30+
{
31+
use: "@gridsome/source-filesystem",
32+
options: {
33+
path: "post/**/*.md",
34+
typeName: "realTimePost",
35+
remark: {},
36+
},
37+
},
3038
{
3139
use: "@gridsome/plugin-sitemap",
3240
},

gridsome.server.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,11 @@ module.exports = function(api) {
7171
const springShellPost = await axios.get(`https://jfrog.com/latest-springshell-posts`)
7272
const NpmToolsPost = await axios.get(`https://jfrog.com/latest-npmtools-posts`)
7373

74-
store.addMetadata("latestPostsJSON", JSON.stringify(data))
74+
const post = data.map((post,imageIndex)=>{
75+
post.img='/latest-posts-'+imageIndex+'.webp';
76+
return post;
77+
})
78+
store.addMetadata("latestPostsJSON", JSON.stringify(post))
7579
store.addMetadata("latestCVEPostsJSON", JSON.stringify(CVEPost.data))
7680
store.addMetadata("latestLog4ShellPostsJSON", JSON.stringify(Log4shellPost.data))
7781
store.addMetadata("latestSpringShellPostsJSON", JSON.stringify(springShellPost.data))
@@ -95,6 +99,13 @@ module.exports = function(api) {
9599
platform: String
96100
downloads_text: String
97101
cvss: String
102+
tag: String
103+
img: String
104+
excerpt: String
105+
minutes: String
106+
date: Date
107+
108+
98109
}
99110
`)
100111
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
---
2+
excerpt: Our security research team has discovered a harmful PyTorch model on @huggingface, identified as dtonala/DeepSeek-R2, which is delivering the XMRig cryptominer as its payload. This poses a significant threat, particularly considering the popularity of DeepSeek-R1 and the beta
3+
title: Malicious DeepSeek‑R2 PyTorch Model Discovered Hosting XMRig Miner
4+
date: "July 23, 2024"
5+
description: "Or Peles, JFrog Senior Security Researcher"
6+
tag: "Real Time Post"
7+
img: /img/RealTimePostImage/malicious-deepseek‑r2-pytorch-model-discovered-hosting-xmrig-miner.png
8+
type: realTimePost
9+
minutes: '12'
10+
11+
12+
---
13+
14+
15+
Our security research team has discovered a harmful PyTorch model on [@huggingface](https://x.com/huggingface), identified as **dtonala/DeepSeek-R2**, which is delivering the **XMRig cryptominer** as its payload. This poses a significant threat, particularly considering the popularity of DeepSeek-R1 and the beta status of DeepSeek-R2, which could allow attackers to take advantage of user trust and distribute a model that conceals a crypto miner download. Users who are unaware and enthusiastic about trying out DeepSeek-R2 may fall victim to this threat. Notably, the malicious model is in PyTorch format, contrasting with the official DeepSeek models, which utilize the safetensors format.
16+
17+
18+
19+
![](/img/RealTimePostImage/post/malicious-deepseek‑r2-pytorch-model-discovered-hosting-xmrig-miner-post.png)
Lines changed: 14 additions & 0 deletions
Loading

src/components/BackButtonPost.vue

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<template>
2+
<a
3+
class="hover:text-jfrog-green transition-all"
4+
:class="passedClass"
5+
href="#"
6+
@click.prevent="goBack()"
7+
>
8+
< Back
9+
</a>
10+
</template>
11+
12+
<script>
13+
export default {
14+
methods: {
15+
goBack() {
16+
// Get the referrer URL
17+
const referrer = document.referrer;
18+
19+
if (!referrer || window.history.length <= 1) {
20+
this.$router.push('/post/');
21+
return;
22+
}
23+
24+
const referrerUrl = new URL(referrer);
25+
26+
const currentHostname = window.location.hostname;
27+
28+
if (referrerUrl.hostname === currentHostname) {
29+
window.history.back();
30+
} else {
31+
this.$router.push('/post/');
32+
}
33+
}
34+
},
35+
props: {
36+
passedClass: {
37+
type: String,
38+
default: ''
39+
}
40+
}
41+
}
42+
</script>

src/components/Banner.vue

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
:link="link"
1414
/>
1515
</div>
16-
<div class="bottom mt-5 mb-4">
16+
<div v-if="dateString" class="bottom mt-5 mb-4">
1717
Last updated on <span class="font-bold">{{dateString}}</span>
1818
</div>
1919
</div>
@@ -62,18 +62,18 @@ export default {
6262
},
6363
date: {
6464
type: String,
65-
default() {
66-
return new Date()
67-
}
6865
},
6966
},
7067
computed: {
7168
dateString: function () {
69+
if(this.date){
7270
const d = new Date(this.date)
7371
const dayOfMonth = d.getDate()
7472
const monthName = d.toLocaleString('en-US', {month: 'short'})
7573
const year = d.getFullYear()
7674
return `${dayOfMonth} ${monthName}. ${year}`
75+
}
76+
return ''
7777
}
7878
},
7979
components: {
@@ -86,6 +86,7 @@ export default {
8686
@import './../assets/style/variables';
8787
.sr-banner {
8888
background-image: url(~@/assets/img/backgrounds/banner-bg.webp);
89+
8990
.number {
9091
font-size: 42px;
9192
font-weight: 700;
@@ -101,6 +102,10 @@ export default {
101102
}
102103
@media (min-width: #{$md}) {
103104
max-width: 243px;
105+
min-height: 153px;
106+
display: flex;
107+
align-items: center;
108+
justify-content: center;
104109
}
105110
@media (max-width: #{$md}) {
106111
width: 343px;

src/components/ListAndBanner.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ export default {
6262
}, //object
6363
bannerDate: {
6464
type: String,
65-
default: '01-01-2011'
6665
},
6766
gaa: {
6867
type: String,
Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
<template>
2+
<a
3+
class=" block h-full single-post-preview"
4+
:href="postObj.path"
5+
target="_self"
6+
rel=""
7+
data-gac="Links back to JFrog"
8+
data-gaa="Latest Security Blog"
9+
:data-gal="`${postObj.title} | ${postObj.path}`"
10+
>
11+
<div class="image">
12+
13+
<picture>
14+
<source
15+
:srcset="`${postObj.img}`"
16+
type="image/webp"
17+
>
18+
<img
19+
:alt="postObj.title"
20+
:srcset="`${postObj.img}`"
21+
class="object-contain"
22+
height="201"
23+
width="148"
24+
/>
25+
</picture>
26+
27+
</div>
28+
<div>
29+
<div class="text-xs font-weight-500 green-dark mt-5 lg:mt-0 mb-2" v-html="postObj.tag"> </div>
30+
<div class="text-lg font-weight-500 leading-6 text-black " v-html="postObj.title"> </div>
31+
<div class="text-xs text-black mt-3 mb-3" v-html="postObj.description"> </div>
32+
<p class="text-md text-black"> {{postObj.excerpt}} </p>
33+
<div class="latest-published mt-3">
34+
<div class=" text-right text-black text-xs leading-none py-1">Published on <b>{{postObj.date}}</b> </div>
35+
</div>
36+
</div>
37+
</a>
38+
</template>
39+
40+
<script>
41+
42+
import {toBlogDateStr,} from '~/js/functions'
43+
44+
export default {
45+
props: {
46+
postObj: {
47+
type: Object,
48+
default() {
49+
return {
50+
path: '1',
51+
title: 'Post Title Here',
52+
description: 'Post Description Here',
53+
date: '15',
54+
img: 'sec-blog-img-1.png',
55+
tag: 'realtime',
56+
57+
}
58+
}
59+
},
60+
61+
},
62+
computed:{
63+
64+
dateString() {
65+
return toBlogDateStr(this.postObj.date)
66+
},
67+
}
68+
}
69+
</script>
70+
71+
<style lang="scss">
72+
@import './../assets/style/variables';
73+
74+
75+
76+
.font-weight-500{
77+
font-weight: 500;
78+
}
79+
.latest-published{
80+
display: flex;
81+
justify-content: space-between;
82+
align-items: center;
83+
}
84+
.image img{
85+
86+
width: 100%;
87+
height: auto;
88+
@media (min-width: #{$md}){
89+
width: 203px;
90+
height: 148px;
91+
object-fit: cover;
92+
93+
}
94+
}
95+
96+
.green-dark{
97+
color: #008A09;
98+
}
99+
100+
.single-post-preview {
101+
102+
display: grid;
103+
grid-template-columns: 201px 1fr;
104+
column-gap: 22px;
105+
max-width: 100%;
106+
position: relative;
107+
padding-bottom: 24px;
108+
padding-top: 24px;
109+
110+
@media (min-width: #{$md}){
111+
padding-bottom: 24px;
112+
padding-top: 24px;
113+
width: 750px;
114+
&:after{
115+
content: "";
116+
width: 100%;
117+
position: absolute;
118+
left: 0;
119+
bottom: 0;
120+
height: 1px;
121+
background-color: #9CA3AF;
122+
123+
}
124+
}
125+
@media (max-width: #{$md}) {
126+
width: 100%;
127+
grid-template-columns: 100%;
128+
}
129+
}
130+
131+
</style>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
<template>
2+
<div>
3+
<ul
4+
class="block"
5+
>
6+
<component
7+
:is="RealTimePostItem"
8+
v-for="edge in $static.RealTimePost.edges"
9+
:key="edge.node.id"
10+
:postObj="edge.node"
11+
/>
12+
</ul>
13+
14+
15+
</div>
16+
17+
18+
19+
</template>
20+
21+
<static-query>
22+
query realTimePostsMain {
23+
RealTimePost: allRealTimePost (
24+
sortBy: "date",
25+
order: DESC,
26+
limit: 4
27+
filter: {
28+
type: {eq: "realTimePost" }
29+
}
30+
){
31+
edges {
32+
node {
33+
description
34+
title
35+
date
36+
type
37+
excerpt
38+
tag
39+
img
40+
path
41+
}
42+
}
43+
}
44+
}
45+
</static-query>
46+
47+
48+
<script>
49+
import RealTimePostItem from './RealTimePostItem.vue'
50+
export default {
51+
name: 'RealTimePostList',
52+
data() {
53+
return {
54+
RealTimePostItem: RealTimePostItem
55+
}
56+
},
57+
metaInfo: {
58+
title: "Security Research",
59+
meta: [
60+
{
61+
name: "description",
62+
content: "Cutting Edge Security Research to Protect the Modern Software Supply Chain",
63+
},
64+
],
65+
},
66+
components: {
67+
RealTimePostItem: RealTimePostItem
68+
}
69+
}
70+
</script>

0 commit comments

Comments
 (0)